我是个新手,刚接触COM没多长时间,现在遇上一个问题,希望得到大人们的帮助!
  我编写了一个简单的COM(inproc dll)然后用CreateThread方法Create出来的多个线程中间都使用CoCreateInstance来得到生成新的COM对象从而得到COM的接口,可是执行结果显示只有第一个线程成功的获得了接口,其他的线程都fail to get Interface了,请问这是怎么回事?究竟多线程的COM怎么处理呢?

解决方案 »

  1.   

    每个线程都要对com库初始化,就是cominitailize
      

  2.   

    void __stdcall MyThreadFunc(void* pv)
    {


    IDetectFace *piDF=NULL;
    HRESULT hres;
    ::CoInitialize(NULL);
    hres=::CoCreateInstance(CLSID_FaceProcess,NULL,CLSCTX_INPROC_SERVER,
    IID_IDetectFace,(void **)&piDF);          Sleep(1000);
    if (SUCCEEDED(hres))
    {
    trace("Succeeded getting IID_IDetectFace!");
    piDF->DetectFace();
    piDF->Release();
    }
    else
    {
    trace("Failed to get IID_IDetectFace!");
    switch(hres)
    {
    case REGDB_E_CLASSNOTREG:

    trace("REGDB_E_CLASSNOTREG");
    break;

    case E_NOINTERFACE:

    trace("E_NOINTERFACE");
    break;

    }
    }
    ::CoUninitialize();
    }
      

  3.   

    CoInitialize(NULL)改为CoInitializeEx(NULL, COINIT_MULTITHREADED)
      

  4.   

    为什么CoInitializeEx(NULL, COINIT_MULTITHREADED)加上以后,却出现错误"'CoInitializeEx' : undeclared identifier"?
      

  5.   

    在stdafx.h中加上#define _WIN32_DCOM
      

  6.   

    问题已经解决了!
    MSDN上有写:add the ThreadingModel named-value to the InprocServer32 key in the registry.如果没有这个value,那么默认为只能在一个进程中间有第一个线程能拥有COM对象成为
    Apartment
    谢谢大家的帮助!