看了111222的大作:
    让你的浏览器更强!过滤FLASH、控件等等(http://dev.csdn.net/develop/article/11/11108.shtm)
觉得写得很好,其中有些实现方法却不清楚,希望大家帮帮忙。
摘自原文部份内容:
    ……下面就说在自编浏览器里的具体实现:……首先,给你的自编浏览器填加一个ATL类,填加之后CLASS向导会自动给你的工程加一个modul,这些我们都不必理会。假设所填加的类叫:IAUrl;之后你要做的就是给类填加IInternetProtocolInfo和IInternetProtocol两个接口的实现(就是不明白如何添加这两个接口)。

解决方案 »

  1.   

    Asynchronous Pluggable Protocol Implementation with ATL
    http://www.codeguru.com/Cpp/COM-Tech/atl/misc/article.php/c37/
      

  2.   

    请各位高手给指点一下,何处有问题,因为对ATL完全不懂,不会用编辑器生成(没有找到),只能手工模仿,现将原代码贴上,请高手指点是否有错的地方或有遗漏的地方:
    在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);
    }
    }
      

  3.   

    BEGIN_COM_MAP(CMyFilter)
    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是你的缺省接口!