1

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

4

0 回答 0