确定COM是In-Proc还是LocalServer

时间:2013-03-26 00:54:39

标签: c++ windows winapi com

我有一个使用COM库的应用程序,只是想知道如何知道该应用程序是否将该COM库用作LocalServer或In-Proc?

我查看了以这种方式构建的代码:

DATCOMLib::ITEmulationPtr pTE(__uuidof(DATCOMLib::TEmulation));

3 个答案:

答案 0 :(得分:1)

部分取决于您在创建对象时提供的执行上下文 - 有关详细信息,请参阅此处:http://msdn.microsoft.com/en-us/library/windows/desktop/ms693716(v=vs.85).aspx

您可以在注册表中查找组件的类ID,并检查它是否具有LocalServer子键。所以在你的情况下你会寻找:

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{CLSID of DATACOMLib::TEmulation}\LocalServer

如果它是In Proc COM组件,它将改为使用以下密钥:

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{CLSID of DATACOMLib::TEmulation}\InProcServer32

查看此文档以获取更多详细信息:http://msdn.microsoft.com/en-us/library/aa908849.aspx

答案 1 :(得分:1)

可以通过多种方式找到它

  1. 从查看代码 - 检查调用“ CreateInstance ”或“ CoCreateInstance ”时传递的类上下文是什么 - (CLSCTX_INPROC_XXXX然后它是inproc服务器表示它是DLL,它将加载到调用应用程序进程地址空间.CLSCTX_LOCAL_SERVER,CLSCTX_REMOTE_SERVER - 然后它是作为一个单独的进程运行的COM服务器。有一些#defines结合了一个或多个标志。只是google it)

    ITEmulationPtr.CreateInstance(uuid(TEmulation), 0, CLSCTX_XXX)

  2. 如果您可以访问安装了COM组件的计算机,那么您可以按照上面的回答中所述的步骤进行操作

答案 2 :(得分:0)

  1. 运行您的应用并确保它加载COM对象(代码已到达您问题中显示的部分)
  2. 打开进程资源管理器(如果您还没有,请从Microsoft获取)
  3. 使用进程资源管理器搜索dll名称,如果它在你的exe中,那么它就是in-proc,否则就不是。