Я реализую компонент 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);