Exemple #1
0
/*
    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;
}
Exemple #3
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 ;
}
Exemple #5
0
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;
}
Exemple #6
0
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;
}
Exemple #8
0
//----------------------------------------------------------------------
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;
}