-1

我对 Microsoft COM 技术不是很熟悉。简而言之,我有一个在可执行文件中实现的Microsoft 进程外 COM 服务器foo.exe。环境是 C++ 和 Microsoft 基础类框架 (MFC)。

有一个客户端bar.exe通过 Microsoft COM 技术使用 foo.exe 中的功能。在 foo.exe 中涉及一些动态链接库,它们也使用 COM 服务器 foo.exe 提供的功能(例如fooBar.dll)。

到现在为止还挺好。我正在寻找一种方法来确定 COM 服务器 foo.exe 的客户端是否位于其他进程中,甚至与 foo.exe 位于同一进程中,例如上例中的 fooBar.dll。有谁知道这样的方式?

编辑: 换句话说:显然 COM 服务器foo.exe可以充当进程内或进程外 COM 服务器。加上 Hans Passant 的评论和 Joe Willcoxson 的回答,他提议通过来解决调用 DLLGetModuleHandle以确定 COM 服务器当前是否充当进程内服务器,以防我得到句柄时和我没有将句柄作为进程外服务器。因此,当 COM 服务器知道在同一进程中使用来自该服务器的功能的众所周知的 DLL 时,我们可以说 COM 服务器此时充当进程内服务器,而在其他情况下充当进程外服务器。 -进程服务器。我是否误解了某些事情,或者这些考虑是否正确?

我目前的调查没有提及,所以我希望社区中有一位了解手推车如何运行的 Microsoft COM 专家。

非常感谢您的帮助!

4

2 回答 2

1

一旦你已经有了一个 COM 指针,我不确定你会怎么做。但是,当您创建对象时,有一种方法。

CoCreateInstance()函数采用标志CLSCTX_INPROC_SERVER, CLSCTX_INPROC_HANDLER, CLSCTX_LOCAL_SERVER, CLSCTX_REMOTE_SERVER

通常,当您使用 ATL 之类的东西时,默认参数是组合标志,它只返回可用的任何内容。而不是这样做,您可以单独尝试标志并查看是否使用特定标志创建了对象。

我应该补充一点,如果对象实际上是 OLE 对象/服务器,则有一种方法。如果是这种情况,那么您可以查询 IViewObject。如果它在进程中,它将没有该接口。如果它不在进程中,那么它将具有接口。

另一件事,如果对象实现了 IRunnableObject 而您没有做任何事情来专门将其置于运行状态,那么进程内对象很可能处于运行状态,而进程外对象将不会处于运行状态状态。

一个非常简单的 hack 可能是GetModuleHandle()使用 DLL 的名称进行调用。如果它返回一个句柄,那么它是在进程中。这不是一个通用的解决方案,它需要您事先知道 DLL 的名称。

于 2015-10-21T04:13:25.260 回答
0

在 COM 服务器foo.exe中,您可以执行以下操作。

CTheApp::InitInstance()
{
    [...]
    bool runAsOutOfProcessServer = false;
    CCommandLineInfo commandInfo;
    ParseCommandLine(commandInfo);
    if(commandInfo.m_bRunEmbedded || commandInfo.m_bRunAutomated)
    { 
           runAsOutOfProcessServer = true;
    }
    [...]

    if(runAsOUtOfProcessServer)
       AfxMessageBox("Out of Process Invocation");
}

很明显, CCommandLineInfo中有两个成员,表明进程作为 OLE 自动化服务器启动或启动以编辑嵌入的 OLE 项。使用ParseCommandLine,您可以通过调用局部变量来获取信息commandInfo。然后您可以检查成员m_bRunEmbeddedm_bRunAutomated设置以确定其中的COM Serverfoo.exe是否已启动。runAsOutOfProcessServer然后,只有当局部变量为真时,您才能在最后弹出消息框。

于 2015-10-29T12:20:37.243 回答