2015-10-20 23 views
-1

我对Microsoft COM技术并不是很熟悉。简而言之,我有一个在可执行文件foo.exe中实现的Microsoft Out-of-process COM Server。环境是C++和Microsoft基础类框架(MFC)。如何识别Microsoft COM-Server的客户端是否在进程外或进程内?

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

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

编辑: 随着换句话说:明显COM服务器foo.exe可以作为同进程或进程外的一个COM服务器采取行动。要添加Hans Passant的评论以及Joe Willcoxson的回答,他提议通过GetModuleHandle来解决调用DLL,以确定COM服务器当前是否作为进程内服务器运行,以防万一当我得到该句柄并且在我没有得到作为进程外服务器的句柄。因此,当COM服务器意识到在同一进程中使用来自该服务器的功能的知名DLL时,我们可以说COM服务器在此刻作为进程内服务器而在其他情况下作为out-of进程服务器。我是否误解了某些内容或者这些考虑是否正确?

我目前的调查并不值得提及,所以我希望社区中有一位知道手推车运行情况的微软COM专家。

非常感谢您的帮助!

+1

拥有一个有效的接口指针,你不应该打扰谁精确地实现它,特别是如果你不直接与服务器通信,那么你可以与代理交谈。也就是说,没有标准的方法,但是你可以查询一些已知的不能跨进程边界进行可伸缩的接口,并且在你得到指针的情况下,你知道服务器在这个过程中。 –

+0

这个问题没有意义,进/出进程中的条款仅适用于服务器。客户端代码始终处于其自己的过程中。 –

+2

你是说服务器(而不是客户端)加载一个DLL,然后转向并调用同一台服务器上的方法?无论如何,你为什么关心谁在调用这个方法?你想要解决什么实际问题? –

回答

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以确定foo.exe内的COM服务器是否已启动。最后,只有当本地变量runAsOutOfProcessServer为真时,才可以弹出消息框。

1

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

CoCreateInstance()函数带标记CLSCTX_INPROC_SERVER, CLSCTX_INPROC_HANDLER, CLSCTX_LOCAL_SERVER, CLSCTX_REMOTE_SERVER

通常,当您使用ATL之类的默认参数是组合标志,它只是返回任何可用的标志。而不是这样做,你可以单独尝试这些标志,看看是否有一个特定的标志创建对象。

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

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

一个非常简单的黑客可能会调用GetModuleHandle()与DLL的名称。如果它返回一个句柄,那么它正在处理中。这不是一个通用的解决方案,它需要事先知道DLL的名称。

+0

感谢您的回答。你带我进一步考虑我附加的问题。请参阅编辑部分。 – kbisang

相关问题