我是COM的一个完整的初学者,并且正在掌握它的来龙去脉。 对,我正试图解决一个问题(这是我的测试任务的一部分)。
我需要做的是在本机C ++中创建一个自注册exe COM服务器,即在执行时注册一些COM对象的可执行文件。我发现大多数示例都说明了在dll中实现服务器并在其上使用regsvr32,但我需要完全自我注册的exe。
有人可以解释我该怎么做?
UPD:好的,多一点:它不起作用。这是一个片段:int _tmain(int argc, _TCHAR* argv[])
{
IClassFactory *factory = new ISimpleServerFactory();
DWORD classToken;
::CoInitialize(NULL);
CoRegisterClassObject(
IID_ISimpleServer,
factory,
CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE,
&classToken);
ISimpleServer *pISimpleServer = NULL;
HRESULT hr = CoCreateInstance(
CLSID_CSimpleServer,
NULL,
CLSCTX_LOCAL_SERVER,
IID_ISimpleServer,
(void **)&pISimpleServer); //<<<<<<<<<<<<<<<< FAILS
if(SUCCEEDED(hr))
printf("Instantiation successful\n");
if(pISimpleServer != NULL)
pISimpleServer->Release();
std::cin.ignore();
CoRevokeClassObject(classToken);
::CoUninitialize();
return 0;
}
事情是CoRegisterClassObject成功,但CoCreateInstance告诉我对象没有注册。我做错了什么? (我将代码统一到相同的模块中进行调试,因为它在不同的应用程序中不起作用)。
UPD2:Peter Huene帮助了这个 - 必须使用CLSID而不是IID。现在它在进行中。但是当在进程外调用时(来自独立客户端),CoCreateInstance永远不会返回。为什么会这样?