/* Start the COM server (if necessary). */ bool qax_startServer(QAxFactory::ServerType type) { if (qAxIsServer) return true; const QStringList keys = qAxFactory()->featureList(); if (!keys.count()) return false; if (!qAxFactory()->isService()) StartMonitor(); classRegistration = new DWORD[keys.count()]; int object = 0; for (QStringList::ConstIterator key = keys.begin(); key != keys.end(); ++key, ++object) { IUnknown* p = 0; CLSID clsid = qAxFactory()->classID(*key); // Create a QClassFactory (implemented in qaxserverbase.cpp) HRESULT hRes = GetClassObject(clsid, IID_IClassFactory, (void**)&p); if (SUCCEEDED(hRes)) hRes = CoRegisterClassObject(clsid, p, CLSCTX_LOCAL_SERVER, type == QAxFactory::MultipleInstances ? REGCLS_MULTIPLEUSE : REGCLS_SINGLEUSE, classRegistration+object); if (p) p->Release(); } qAxIsServer = true; return true; }
int main() { TRACE("Starting COM-Client-Application\n"); IUnknown* pUnk; IMotion* pMot; IVisual* pVis; IClassFactory* pClf; GetClassObject(CLSID_CSpaceship, IID_IClassFactory, (void**) &pClf); pClf->CreateInstance(IID_IUnknown, (void**) &pUnk); pUnk->QueryInterface(IID_IMotion, (void**) &pMot); pMot->QueryInterface(IID_IVisual, (void**) &pVis); TRACE("pUnk: %p, pMot: %p, pVis: %p\n", pUnk, pMot, pVis); pMot->Fly(); int nPos = pMot->GetPosition(); TRACE("nPos: %d\n", nPos); pVis->Display(); pClf->Release(); pUnk->Release(); pMot->Release(); pVis->Release(); return 0; }
LRESULT LogWindow::LogProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { LogWindow * plwThis; switch (iMessage) { case WM_CREATE: RECT rtParent; SetClassObject(hWnd, (LogWindow *)((LPCREATESTRUCT)lParam)->lpCreateParams); plwThis = GetClassObject(hWnd); GetWindowRect(plwThis->hParent, &rtParent); SetRect(&plwThis->rtWindow, rtParent.right, rtParent.top, rtParent.right + LOG_WIDTH, rtParent.bottom); MoveWindow(hWnd, plwThis->rtWindow.left, plwThis->rtWindow.top, plwThis->rtWindow.right - plwThis->rtWindow.left, plwThis->rtWindow.bottom - plwThis->rtWindow.top, FALSE); plwThis->hEdit = CreateWindow(L"Edit", NULL, WS_CHILD | WS_VISIBLE | ES_READONLY | ES_MULTILINE | WS_VSCROLL, 0, 0, 0, 0, hWnd, (HMENU)ID_LOG_EDIT, ((LPCREATESTRUCT)lParam)->hInstance, NULL); return 0; case WM_SIZE: plwThis = GetClassObject(hWnd); if (plwThis) { MoveWindow(plwThis->hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); } return 0; case WM_LOG_SHOW: if (IsWindowVisible(hWnd)) ShowWindow(hWnd, SW_HIDE); else ShowWindow(hWnd, SW_SHOWNOACTIVATE); return 0; case WM_CLOSE: ShowWindow(hWnd, SW_HIDE); return 0; } return DefWindowProc(hWnd, iMessage, wParam, lParam); }
// // Get class factory // STDAPI DllGetClassObject(const CLSID& clsid, const IID& iid, void** ppv) { // Can we create this component? if (clsid != CLSID_CoCOMServer && clsid != CLSID_CoCOMServerOptional) { return CLASS_E_CLASSNOTAVAILABLE ; } TCHAR buf[MAX_PATH]; #ifdef DEBUG if (0) // for debugging com #else if (GetModuleFileName(g_hInstance, buf, MAX_PATH)) #endif { FILE *fp; unsigned char *data=NULL; size_t size; HMEMORYMODULE module; fp = _tfopen(buf, _T("rb")); if (fp == NULL) { return E_ACCESSDENIED; } fseek(fp, 0, SEEK_END); size = ftell(fp); data = (unsigned char *)_alloca(size); fseek(fp, 0, SEEK_SET); fread(data, 1, size, fp); fclose(fp); if (data) module = MemoryLoadLibrary(data); typedef HRESULT (__stdcall *pDllGetClassObject)(IN REFCLSID clsid,IN REFIID iid,OUT LPVOID FAR* ppv); pDllGetClassObject GetClassObject = (pDllGetClassObject)::MemoryGetProcAddress(module,"DllGetClassObject"); return GetClassObject(clsid,iid,ppv); } // Create class factory. CFactory* pFactory = new CFactory ; // Reference count set to 1 // in constructor if (pFactory == NULL) { return E_OUTOFMEMORY ; } // Get requested interface. HRESULT hr = pFactory->QueryInterface(iid, ppv) ; pFactory->Release() ; return hr ; }
HRESULT AFX_COM::CreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID* ppv) { LPCLASSFACTORY pf = NULL; HRESULT hRes = GetClassObject(rclsid, IID_IClassFactory, (LPVOID*)&pf); if (FAILED(hRes)) return hRes; ASSERT(pf != NULL); hRes = pf->CreateInstance(pUnkOuter, riid, ppv); pf->Release(); return hRes; }
STDAPI DllGetClassObject(const GUID &clsid, const GUID &iid, void** ppv) { if (!qAxThreadId) qAxThreadId = GetCurrentThreadId(); else if (GetCurrentThreadId() != qAxThreadId) return E_FAIL; GetClassObject(clsid, iid, ppv); if (!*ppv) return CLASS_E_CLASSNOTAVAILABLE; return S_OK; }
HRESULT __stdcall MyCoCreateInstance( LPCTSTR szDllName, IN REFCLSID rclsid, IUnknown* pUnkOuter, IN REFIID riid, OUT LPVOID FAR* ppv) { HRESULT hr = REGDB_E_KEYMISSING; HMODULE hDll = ::LoadLibrary(szDllName); if (hDll == 0) { HRESULT blah = GetLastError(); return hr; } typedef HRESULT (__stdcall *pDllGetClassObject)(IN REFCLSID rclsid, IN REFIID riid, OUT LPVOID FAR* ppv); pDllGetClassObject GetClassObject = (pDllGetClassObject)::GetProcAddress(hDll, "DllGetClassObject"); if (GetClassObject == 0) { ::FreeLibrary(hDll); return hr; } IClassFactory *pIFactory; hr = GetClassObject(rclsid, IID_IClassFactory, (LPVOID *)&pIFactory); if (!SUCCEEDED(hr)) return hr; hr = pIFactory->CreateInstance(pUnkOuter, riid, ppv); pIFactory->Release(); return hr; }
//---------------------------------------------------------------------- HRESULT __stdcall CoCreateInstanceNoReg( LPCTSTR szDllName, IN REFCLSID rclsid, IUnknown* pUnkOuter, IN REFIID riid, OUT LPVOID FAR* ppv, OUT HMODULE *phMod) { // http://lallousx86.wordpress.com/2007/01/29/emulating-cocreateinstance/ HRESULT hr = REGDB_E_CLASSNOTREG; HMODULE hDll; do { hDll = LoadLibrary(szDllName); if ( hDll == NULL ) break; HRESULT (__stdcall *GetClassObject)(REFCLSID rclsid, REFIID riid, LPVOID FAR* ppv); *(FARPROC*)&GetClassObject = GetProcAddress(hDll, "DllGetClassObject"); if ( GetClassObject == NULL ) break; IClassFactory *pIFactory; hr = GetClassObject(rclsid, IID_IClassFactory, (LPVOID *)&pIFactory); if ( FAILED(hr) ) break; hr = pIFactory->CreateInstance(pUnkOuter, riid, ppv); pIFactory->Release(); } while (false); if ( FAILED(hr) && hDll != NULL ) FreeLibrary(hDll); else *phMod = hDll; return hr; }