我正在测试一个将使用 coregisterclassobject 注册的自定义类工厂,我注意到它会导致线程问题。
我创建了一个测试 com 对象并创建了它的一个实例,一切都按预期运行。它是一个 inproc 服务器,在注册表中,它的 ThreadingModel 是“Apartment”。如果我用 apartment_threaded 调用 CoInitializeEx,它会在同一个线程上创建对象,如果我用 COINIT_MULTITHREADED 调用它,它应该在一个单独的线程上创建它(因为它不能在多线程单元中创建)。
但是,如果我首先创建自定义类工厂的实例并将其注册到 coregisterclassobject,则该对象总是在同一个线程上创建,即使线程模型与线程的单元不匹配。我认为使用 coregisterclassobject 不会改变线程在多线程单元中并且对象只能在单线程单元中的事实。
CoInitializeEx(NULL, COINIT_MULTITHREADED);
//CustomClassFactory *factory = new CustomClassFactory();
DWORD regNum = 0;
CLSID clsid = __uuidof(TestComObjLib::TestComObjCoClass);
//CoRegisterClassObject(clsid, factory, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, ®Num);
{
TestComObjLib::ITestComObjPtr ptr;
HRESULT hr = ptr.CreateInstance(clsid, NULL);
if(ptr){
auto str = ptr->HelloWorld();
cout << str << endl;
}
}
//CoRevokeClassObject(regNum);
CoUninitialize();
以上按预期生成了新线程,但如果我取消注释注释行,COM 不会创建任何新线程。我的类工厂没有做任何奇怪的事情。它只是加载 dll directyl 并调用 DllGetClassObject 来获取 com 定义的类工厂并在其上调用 createinstance。对 HelloWorld 的调用仍然有效,但我只是不确定为什么线程不是我所期望的。