예제 #1
0
static ICompilerPtr NewCompiler()
{
	ICompilerPtr piCompiler;
	HRESULT hr = piCompiler.CreateInstance(__uuidof(DolphinCompiler));

	if (SUCCEEDED(hr))
		return piCompiler;

	if (hr == REGDB_E_CLASSNOTREG)
	{
		// Try and register it
		HINSTANCE hLib = LoadCompiler();
		if (hLib)
		{
			// It loaded, now try invoking the class factory entry point
			GETCLASSOBJPROC pfnFactory = (GETCLASSOBJPROC)::GetProcAddress(HMODULE(hLib), "DllGetClassObject");
			if (pfnFactory)
			{
				// Found the entry point, try retrieving the factory
				IClassFactoryPtr piFactory;
				hr = (*pfnFactory)(__uuidof(DolphinCompiler), IID_IClassFactory, (void**)&piFactory);

				if (SUCCEEDED(hr))
				{
					// Now try creating the VM object directly
					hr = piFactory->CreateInstance(NULL, __uuidof(ICompiler), (void**)&piCompiler);
				}
			}
		}
	}

	return piCompiler;
}
예제 #2
0
HRESULT CreateFilterFromLibrary(int index, REFCLSID clsid, REFIID iid, void** ppUnk)
{
	if (index < 0 || index >= importlibnum)
		return E_FAIL;
	if (!fn[index])
		return E_FAIL;
	// create a class factory
	IUnknownPtr pUnk;
	HRESULT hr = fn[index](clsid,  IID_IUnknown,  (void**)&pUnk);
	if (SUCCEEDED(hr))
	{
		IClassFactoryPtr pCF = pUnk;
		if (pCF == NULL)
		{
			hr = E_NOINTERFACE;
		}
		else
		{
			// ask the class factory to create the object
			hr = pCF->CreateInstance(NULL, iid, (void**)ppUnk);
		}
	}
	return hr;
}
/**
 * Fallback thumbnail handler function. (internal)
 * @param hkey_Assoc File association key to check.
 * @param cx
 * @param phbmp
 * @param pdwAlpha
 * @return HRESULT.
 */
HRESULT RP_ThumbnailProvider_Private::Fallback_int(RegKey &hkey_Assoc,
	UINT cx, HBITMAP *phbmp, WTS_ALPHATYPE *pdwAlpha)
{
	// Is RP_Fallback present?
	RegKey hkey_RP_Fallback(hkey_Assoc, L"RP_Fallback", KEY_READ, false);
	if (!hkey_RP_Fallback.isOpen()) {
		return hkey_RP_Fallback.lOpenRes();
	}

	// Get the IThumbnailProvider key.
	wstring clsid_reg = hkey_RP_Fallback.read(L"IThumbnailProvider");
	if (clsid_reg.empty()) {
		// No CLSID.
		return E_FAIL;
	}

	// Convert the CLSID from the string.
	CLSID clsidThumbnailProvider;
	HRESULT hr = CLSIDFromString(clsid_reg.c_str(), &clsidThumbnailProvider);
	if (FAILED(hr)) {
		// Failed to convert the CLSID from string.
		return hr;
	}

	// Get the class object.
	IClassFactoryPtr pCF;
	hr = CoGetClassObject(clsidThumbnailProvider, CLSCTX_INPROC_SERVER, nullptr, IID_PPV_ARGS(&pCF));
	if (FAILED(hr) || !pCF) {
		// Failed to get the IClassFactory.
		return hr;
	}

	// Try getting the IInitializeWithStream interface.
	// FIXME: WMP11 only has IInitializeWithItem.
	IInitializeWithStreamPtr pInitializeWithStream;
	hr = pCF->CreateInstance(nullptr, IID_PPV_ARGS(&pInitializeWithStream));
	if (FAILED(hr) || !pInitializeWithStream) {
		// Failed to get the IInitializeWithStream.
		return hr;
	}

	// Rewind the file.
	this->file->rewind();

	// Initialize the stream.
	hr = pInitializeWithStream->Initialize(this->pstream, this->grfMode);
	if (FAILED(hr)) {
		// Initialize() failed.
		return hr;
	}

	// Try getting the IThumbnailProvider interface.
	IThumbnailProviderPtr pThumbnailProvider;
	hr = pInitializeWithStream->QueryInterface(IID_PPV_ARGS(&pThumbnailProvider));
	if (FAILED(hr) || !pThumbnailProvider) {
		// Failed to get the IThumbnailProvider.
		return hr;
	}

	// Get the thumbnail.
	return pThumbnailProvider->GetThumbnail(cx, phbmp, pdwAlpha);
}