我是 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 永远不会返回。为什么会这样?