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; }
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); }