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; }
HRESULT MiniPlayer::CoCreateInstanceAx(LPCTSTR ax, REFCLSID rclsid, IUnknown *punkOuter, REFIID riid, LPVOID *ppv) { HINSTANCE hInst = _loadedLibs[ax]; if(hInst == NULL) hInst = CoLoadLibrary(const_cast<LPOLESTR>(ax), 0); if(!hInst) return -1; _loadedLibs[ax] = hInst; LPFNGETCLASSOBJECT pfnDllGetObjectClass = reinterpret_cast<LPFNGETCLASSOBJECT>(GetProcAddress(hInst, "DllGetClassObject")); if(!pfnDllGetObjectClass) return -1; IClassFactory *pClsFactory = NULL; HRESULT hr = pfnDllGetObjectClass(rclsid, IID_IClassFactory, (void **)&pClsFactory); IF_CHK(hr, "Unable to get Class Factory."); return pClsFactory->CreateInstance(punkOuter, riid, ppv); Cleanup: if(hInst) CoFreeLibrary(hInst); return hr; }
HRESULT DSHelpCreateInstance( BSTR bstrLibName, REFCLSID rclsid, //XVID guid LPUNKNOWN pUnkOuter, //NULL REFIID riid, //IID_IBaseFilter LPVOID* ppv) //IFilter { // Load the library (bstrlibname should have the fullpath) HINSTANCE hDLL = CoLoadLibrary(bstrLibName, TRUE); if (hDLL == NULL) return E_FAIL; // Get the function pointer typedef HRESULT (WINAPI* PFNDllGetClassObject)( REFCLSID rclsid, REFIID riid, LPVOID* ppv); PFNDllGetClassObject pfnDllGetClassObject = (PFNDllGetClassObject)GetProcAddress( hDLL, "DllGetClassObject"); if (!pfnDllGetClassObject) return E_FAIL; // Get the class faftory CComPtr<IClassFactory> pFactory; HRESULT hr = pfnDllGetClassObject(rclsid, IID_IClassFactory, (LPVOID*)&pFactory); if (hr != S_OK) return hr; // Create object instance return pFactory->CreateInstance(pUnkOuter, riid, ppv); }