BOOL installIA2Support() { LPFNGETCLASSOBJECT IA2Dll_DllGetClassObject; int i; int res; if(isIA2Installed) return TRUE; if((IA2DllHandle=CoLoadLibrary(IA2DllPath,FALSE))==NULL) { LOG_ERROR(L"CoLoadLibrary failed"); return FALSE; } IA2Dll_DllGetClassObject=(LPFNGETCLASSOBJECT)GetProcAddress(static_cast<HMODULE>(IA2DllHandle),"DllGetClassObject"); assert(IA2Dll_DllGetClassObject); //IAccessible2 proxy dll must have this function IUnknown* ia2ClassObjPunk=NULL; if((res=IA2Dll_DllGetClassObject(IAccessible2ProxyIID,IID_IUnknown,(LPVOID*)&ia2ClassObjPunk))!=S_OK) { LOG_ERROR(L"Error calling DllGetClassObject, code "<<res); CoFreeLibrary(IA2DllHandle); IA2DllHandle=0; return FALSE; } if((res=CoRegisterClassObject(IAccessible2ProxyIID,ia2ClassObjPunk,CLSCTX_INPROC_SERVER,REGCLS_MULTIPLEUSE,(LPDWORD)&IA2RegCooky))!=S_OK) { LOG_DEBUGWARNING(L"Error registering class object, code "<<res); ia2ClassObjPunk->Release(); CoFreeLibrary(IA2DllHandle); IA2DllHandle=0; return FALSE; } ia2ClassObjPunk->Release(); for(i=0;i<ARRAYSIZE(ia2Iids);++i) { CoGetPSClsid(ia2Iids[i],&(_ia2PSClsidBackups[i])); CoRegisterPSClsid(ia2Iids[i],IAccessible2ProxyIID); } isIA2Installed=TRUE; return TRUE; }
static void test_CoRegisterPSClsid(void) { HRESULT hr; DWORD dwRegistrationKey; IStream *stream; CLSID clsid; hr = CoRegisterPSClsid(&IID_IWineTest, &CLSID_WineTestPSFactoryBuffer); ok(hr == CO_E_NOTINITIALIZED, "CoRegisterPSClsid should have returened CO_E_NOTINITIALIZED instead of 0x%08lx\n", hr); pCoInitializeEx(NULL, COINIT_APARTMENTTHREADED); hr = CoRegisterClassObject(&CLSID_WineTestPSFactoryBuffer, (IUnknown *)&PSFactoryBuffer, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &dwRegistrationKey); ok_ole_success(hr, "CoRegisterClassObject"); hr = CoRegisterPSClsid(&IID_IWineTest, &CLSID_WineTestPSFactoryBuffer); ok_ole_success(hr, "CoRegisterPSClsid"); hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); ok_ole_success(hr, "CreateStreamOnHGlobal"); hr = CoMarshalInterface(stream, &IID_IWineTest, (IUnknown *)&Test_Unknown, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); ok(hr == E_NOTIMPL, "CoMarshalInterface should have returned E_NOTIMPL instead of 0x%08lx\n", hr); IStream_Release(stream); hr = CoRevokeClassObject(dwRegistrationKey); ok_ole_success(hr, "CoRevokeClassObject"); CoUninitialize(); pCoInitializeEx(NULL, COINIT_APARTMENTTHREADED); hr = CoGetPSClsid(&IID_IWineTest, &clsid); ok(hr == REGDB_E_IIDNOTREG, "CoGetPSClsid should have returned REGDB_E_IIDNOTREG instead of 0x%08lx\n", hr); CoUninitialize(); }