coregisterclassobject не работает с фабрикой классов, собранной из другого потока

Я пытаюсь использовать CoRegisterClassObject, чтобы настроить способ загрузки библиотек DLL, в которых есть объекты com. Я пробую что-то, что решит проблему, с которой я столкнулся, когда тип квартиры потока не соответствовал объекту com. У меня проблема, хотя coregisterclassobject возвращает S_OK, но, похоже, ничего не делает, поскольку объект com по-прежнему зависит от создаваемого реестра. Вот пример, который я написал в качестве доказательства провала концепции (TestComObj — это многопоточная версия).

LPSTREAM factory_stream = NULL; //GLOBAL VARIABLE FOR TEST

DWORD __stdcall FactoryThread(LPVOID param)
{
CoInitialize(NULL);

CustomClassFactory *factory = new CustomClassFactory();
factory->AddRef();
CoMarshalInterThreadInterfaceInStream(IID_IClassFactory, (IClassFactory*)factory, &factory_stream);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
factory->Release();
CoUninitialize();
return 0;
}

И вот соответствующая часть моей основной функции.

CoInitializeEx(NULL, COINIT_MULTITHREADED);

HANDLE regThread = CreateThread(NULL, 0, FactoryThread, NULL, 0, NULL);
Sleep(5000); //ensures that the factory is registered

IClassFactory *factory = NULL;
CoGetInterfaceAndReleaseStream(factory_stream, IID_IClassFactory, (void**)&factory);

DWORD regNum = 0;
HRESULT res = CoRegisterClassObject(clsid, factory, CLSCTX_INPROC_SERVER, REGCLS_MULTI_SEPARATE, &regNum);
//res == S_OK
{
TestComObjLib::ITestComObjPtr ptr;
HRESULT hr = ptr.CreateInstance(__uuidof(TestComObjLib::TestComObjCoClass), NULL);
//hr == E_NOINTERFACE HERE if not registered in the registry
}
CoRevokeClassObject(regNum);
CoUninitialize();

Идея состояла в том, что, поскольку реестр не должен использоваться с CoRegisterClassObject, мне нужно было вручную создавать потоковые объекты квартиры в STA вместо текущего потока MTA. Я заметил, что когда CoRegisterClassObject не используется, CoGetClassObject порождает новый поток и вызывает DllGetClassObject в этом потоке, поэтому я подумал, что фабрику классов нужно просто создать в STA, а затем объекты будут там жить.

Проблема, которую я вижу, состоит в том, что в приведенном выше коде он по-прежнему использует реестр для создания TestComObj, даже если ClassFactory ведет себя правильно. Это довольно просто прямо сейчас. Он просто вызывает LoadLibrary на правильном dll, затем вызывает dllgetclassobject и вызывает createinstance в результате этого. Когда я не имею дела с квартирами и многопоточностью, я могу использовать его для создания объекта com без его регистрации. Так что я не уверен, что здесь происходит не так.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector