ошибка фабрики классов при тестировании COM-сервера - PullRequest
0 голосов
/ 01 августа 2020

Я реализую компонент COM

import "unknwn.idl";
[
    uuid(CF86E2E0-B12D-4C6A-9C5A-D7AA65101E91),
]
coclass CClassic
{
   [default] interface IClassic;
}
[
  object,
  uuid(CF86E2E0-B12D-4C6A-9C5A-D7AA65101E90),
  pointer_default(unique),
  oleautomation
]
interface IClassic : IUnknown
{
    HRESULT Hello();
}

и инкапсулирую его во внутрипроцессную dll и внепроцессную exe соответственно.

В случае dll я могу вызовите метод интерфейса успешно.

Но в случае exe возникла ошибка 80040154. Следуя this do c, я зарегистрировал прокси и проверил реестр, все необходимые ключи / значения реестра есть.

Как это происходит? Я сомневаюсь, что что-то отсутствует в приведенном выше файле idl. Большое спасибо !!!

Обновление

comexe. cpp

#include <atlbase.h>
#include <atlcom.h>
/*
cl /nologo /EHsc comexe.cpp comobj.cpp classic/classic_i.c /link /debug
cl /nologo /EHsc /DREGISTER_PROXY_DLL classic/classic_p.c classic/classic_i.c classic/dlldata.c /link /dll /out:comproxy.dll /export:DllGetClassObject /export:DllCanUnloadNow /export:DllRegisterServer /export:DllUnregisterServer /export:GetProxyDllInfo rpcrt4.lib
*/
struct MyModule : CAtlExeModuleT<MyModule>
{
  HRESULT RegisterClassObjects(
        _In_ DWORD dwClsContext,
        _In_ DWORD dwFlags)
    {
    auto hr = CAtlExeModuleT::RegisterClassObjects(dwClsContext,dwFlags);
    printf("RegisterClassObjects 0x%x\n",hr);
    return hr;
    }

    HRESULT RegisterServer(
        _In_ BOOL bRegTypeLib = FALSE,
        _In_opt_ const CLSID* pCLSID = NULL)
    {
        auto hr = CAtlExeModuleT::RegisterServer(false, pCLSID);
        if(FAILED(hr))
          printf("Toaster register failed 0x%x\n",hr);
        return hr;
    }
};

MyModule mod;

int main(int argc, char *args[])
{
  mod.WinMain(SW_HIDE);
}

comobj. cpp

#include <atlbase.h>
#include <atlcom.h>
#include <typeinfo>
//#include "comobj.h"
#include "classic/classic.h"

CComModule _Module;
extern "C" CLSID CLSID_CClassic;

struct Toast : CComObjectRoot,CComCoClass<Toast,&CLSID_CClassic>,IClassic
{
  DECLARE_REGISTRY(CLSID_CClassic,"Toaster.1.0","Toaster","Toast Server",THREADFLAGS_BOTH);
  DECLARE_CLASSFACTORY();
  DECLARE_OBJECT_DESCRIPTION("Toast Server");
  
  HRESULT STDMETHODCALLTYPE Hello( void)
  {
    printf("Hello\n");
    return S_OK;
  }

  Toast()
  {
    printf("Toast alive\n");
    printf("%s\n",typeid(_ClassFactoryCreatorClass).name());
  }  

  BEGIN_COM_MAP(Toast)
    COM_INTERFACE_ENTRY(IClassic)
  END_COM_MAP();
  
};


OBJECT_ENTRY_AUTO(CLSID_CClassic,Toast);
...