class ATL_NO_VTABLE CMyFirstCOM :
  public CComObjectRootEx<CComSingleThreadModel>
, public CComCoClass<CMyFirstCOM, &CLSID_MyFirstCOM>
, public IDispatchImpl<IMyFirstCOM, &IID_IMyFirstCOM, &LIBID_myFirstCOMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
explicit CMyFirstCOM(int val);
~CMyFirstCOM();

....
};编译后报如下错误:加上一个CMyFirstCOM(); 编译就通过了。请问是什么原因?

解决方案 »

  1.   

    这是ATL的实现, ATL封装的这个COM类是不能直接实例化的,具体细节可参考《深入解析ATL》
      

  2.   

    explicit CMyFirstCOM(int val);
    ---- 加了明确构造函数
      

  3.   

     
    不加“explicit”关键字也一样的。后面加上默认构造函数时,这个关键字是去掉了的。
      

  4.   


    类厂?oh, my god! 有没有可能绕开这个机制?
      

  5.   

    可以,问题是你这个参数什么值? 
    创建的时候是使用        STDAPI CoCreateInstance(
      REFCLSID rclsid,
      LPUNKNOWN pUnkOuter,
      DWORD dwClsContext,
      REFIID riid,
      LPVOID * ppv
    );
    创建的,并没有给你传参数的地方.
      

  6.   

    ATL默认包装类不就默认无参默认构造函数吗
      

  7.   

    1、COM规范指明了,一个组件刚刚创建的时候是“未初始化”的
    2、类厂创建组件时也是无法传递参数的,必须提供默认无参构造函数
    3、如果需要初始化组件,有许多机制:
    A. 组件成员变量提供默认值(这是C++的机制)
    B. 组件实现持久化接口,由客户端调用这些接口来初始化数据,可以从结构化存储、网络、文件、内存中加载数据
    C. 组件实现属性包接口,客户端一次性提供所有属性数据供初始化
    D. 组件实现属性或方法,客户端调用它们初始化
    E. 避开类厂机制,由自己创建组件,想怎么初始化都行,带参数构造函数也可以,不过风险很大