看了111222的大作:
让你的浏览器更强!过滤FLASH、控件等等(http://dev.csdn.net/develop/article/11/11108.shtm)
觉得写得很好,其中有些实现方法却不清楚,希望大家帮帮忙。
摘自原文部份内容:
……下面就说在自编浏览器里的具体实现:……首先,给你的自编浏览器填加一个ATL类,填加之后CLASS向导会自动给你的工程加一个modul,这些我们都不必理会。假设所填加的类叫:IAUrl;之后你要做的就是给类填加IInternetProtocolInfo和IInternetProtocol两个接口的实现(就是不明白如何添加这两个接口)。
让你的浏览器更强!过滤FLASH、控件等等(http://dev.csdn.net/develop/article/11/11108.shtm)
觉得写得很好,其中有些实现方法却不清楚,希望大家帮帮忙。
摘自原文部份内容:
……下面就说在自编浏览器里的具体实现:……首先,给你的自编浏览器填加一个ATL类,填加之后CLASS向导会自动给你的工程加一个modul,这些我们都不必理会。假设所填加的类叫:IAUrl;之后你要做的就是给类填加IInternetProtocolInfo和IInternetProtocol两个接口的实现(就是不明白如何添加这两个接口)。
http://www.codeguru.com/Cpp/COM-Tech/atl/misc/article.php/c37/
在ATL的.h中
class ATL_NO_VTABLE CMyFilter :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyFilter, &CLSID_MyFilter>,
public IInternetProtocol,
public IInternetProtocolSink
{
public:
CMyFilter(){}
DECLARE_REGISTRY_RESOURCEID(IDR_MYFILTER)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CMyFilter)
COM_INTERFACE_ENTRY(IInternetProtocolRoot)
COM_INTERFACE_ENTRY(IInternetProtocol)
COM_INTERFACE_ENTRY(IInternetProtocolSink)
END_COM_MAP()
public:
// IInternetProtocolRoot
HRESULT STDMETHODCALLTYPE Start(
/* [in] */ LPCWSTR szUrl,
/* [in] */ IInternetProtocolSink __RPC_FAR *pOIProtSink,
/* [in] */ IInternetBindInfo __RPC_FAR *pOIBindInfo,
/* [in] */ DWORD grfPI,
/* [in] */ DWORD dwReserved);
HRESULT STDMETHODCALLTYPE Continue(
/* [in] */ PROTOCOLDATA __RPC_FAR *pProtocolData){return S_OK;}
HRESULT STDMETHODCALLTYPE Abort(
/* [in] */ HRESULT hrReason,
/* [in] */ DWORD dwOptions){ return S_OK;}
HRESULT STDMETHODCALLTYPE Terminate(
/* [in] */ DWORD dwOptions){ return S_OK;}
HRESULT STDMETHODCALLTYPE Suspend( void){ return E_NOTIMPL;}
HRESULT STDMETHODCALLTYPE Resume( void){return E_NOTIMPL;}
// IInternetProtocol based on IInternetProtocolRoot
HRESULT STDMETHODCALLTYPE Read(
/* [length_is][size_is][out][in] */ void __RPC_FAR *pv,
/* [in] */ ULONG cb,
/* [out] */ ULONG __RPC_FAR *pcbRead){return S_OK;}
HRESULT STDMETHODCALLTYPE Seek(
/* [in] */ LARGE_INTEGER dlibMove,
/* [in] */ DWORD dwOrigin,
/* [out] */ ULARGE_INTEGER __RPC_FAR *plibNewPosition){return S_OK;}
HRESULT STDMETHODCALLTYPE LockRequest(
/* [in] */ DWORD dwOptions){ return S_OK;}
HRESULT STDMETHODCALLTYPE UnlockRequest( void){return S_OK;}
//IInternetProtocolSink
HRESULT STDMETHODCALLTYPE Switch(
/* [in] */ PROTOCOLDATA __RPC_FAR *pProtocolData){return S_OK;}
HRESULT STDMETHODCALLTYPE ReportProgress(
/* [in] */ ULONG ulStatusCode,
/* [in] */ LPCWSTR szStatusText){return S_OK;}
HRESULT STDMETHODCALLTYPE ReportData(
/* [in] */ DWORD grfBSCF,
/* [in] */ ULONG ulProgress,
/* [in] */ ULONG ulProgressMax){return S_OK;}
HRESULT STDMETHODCALLTYPE ReportResult(
/* [in] */ HRESULT hrResult,
/* [in] */ DWORD dwError,
/* [in] */ LPCWSTR szResult){return S_OK;}
private:
IInternetProtocolSink* m_pProtocolSink;
};
在ATL的.CPP中:
HRESULT STDMETHODCALLTYPE CMyFilter::Start(
/* [in] */ LPCWSTR szUrl,
/* [in] */ IInternetProtocolSink __RPC_FAR *pOIProtSink,
/* [in] */ IInternetBindInfo __RPC_FAR *pOIBindInfo,
/* [in] */ DWORD grfPI,
/* [in] */ DWORD dwReserved)
{
USES_CONVERSION;
m_pProtocolSink = pOIProtSink;
CString s(szUrl);
if (s.Right(4) == ".gif")
{
m_pProtocolSink ->AddRef();
m_pProtocolSink ->ReportResult(S_OK, 0, 0);
m_pProtocolSink ->Release();
return S_OK;
}
return INET_E_USE_DEFAULT_PROTOCOLHANDLER;
}
在ATL的.idl中
import "oaidl.idl";
import "ocidl.idl";
[
uuid(014B9E8B-3F44-4549-869F-E19D766CD226),
version(1.0),
helpstring("Expl0rer 1.0 Type Library")
]
library Expl0rerLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(1B12FE60-A8F0-44D3-9604-851EB0700B0E),
helpstring("MyFilter Class")
]
coclass MyFilter
{
interface IUnknown;
};
};
在CMainFrme.h中添加:
IInternetSession* m_pSession;
IClassFactory* m_pFactory;
在CMainFrme.cpp的OnCreate中添加:
if (CoGetClassObject(CLSID_MyFilter, CLSCTX_SERVER, NULL, IID_IClassFactory, (void**)&m_pFactory) == S_OK)
{
if(CoInternetGetSession(0, &m_pSession, 0) == S_OK)
{
m_pSession->RegisterNameSpace(m_pFactory, CLSID_MyFilter, L"http", 0, NULL, 0);
}
}
COM_INTERFACE_ENTRY(IInternetProtocolRoot)
COM_INTERFACE_ENTRY(IInternetProtocol)
COM_INTERFACE_ENTRY(IInternetProtocolSink)
END_COM_MAP()
写的不对!
我看了一整也不知道CMyFilter对应的缺省接口是哪个?
你把你的idl文件贴出来!
要实现多接口必须用COM_INTERFACE_ENTRY2这个宏eg:
COM_INTERFACE_ENTRY2(IDispatch, IMyDualInterface) 假设IMyDualInterface是你的缺省接口!