在...vc98\include\unknwn.h里面,IUnknown的AddRef,Release,QueryInterface都是纯虚接口。
我想知道,COM客户端程序既然ATL工程里面用#import生成的结构体是从IUnknown继承的,为什么不需要实现这几个纯虚函数呢?

解决方案 »

  1.   

    你Import的时候,生成的包装类,应该自动帮你把这几个接口代码填充好了
      

  2.   

    但是我在tlh/tli文件里面并没有看到这3个函数的实现代码:struct __declspec(uuid("3019bb6f-d822-4bfc-abe9-23468aa965ca"))
    IEvent1 : IUnknown
    {
        //
        // Wrapper methods for error-handling
        //    HRESULT Add (
            long n1,
            long n2 );
        HRESULT Advise (
            struct ICallBack * pCallBack,
            long * pdwCookie );
        HRESULT Unadvise (
            long dwCookie );    //
        // Raw methods provided by interface
        //    virtual HRESULT __stdcall raw_Add (
            long n1,
            long n2 ) = 0;
        virtual HRESULT __stdcall raw_Advise (
            struct ICallBack * pCallBack,
            long * pdwCookie ) = 0;
        virtual HRESULT __stdcall raw_Unadvise (
            long dwCookie ) = 0;
    };
      

  3.   

    概念啊~组件中必须有3个函数不假,QueryInterface、AddRef、Release,它们3个函数也组成IUnknown
    任何接口,其实都包含 IUnknown 接口
    在任何接口上,调用表中的第一个函数,其实就是调用 QueryInterface()函数,就得到你想要的另外一个接口指针。这个性质叫“接口的传递性”
      

  4.   

    而因为你使用的是ATL,你的 C++ 类通常是从某些类,比如CComCoClass派生而来,这些基类已经为你实现了你所说的那些基本接口管理代码
      

  5.   

    接口的实现是COM服务器端的事情,客户端只需要调用这些接口就可以了。