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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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);
}