【问题标题】:.Net COM Interop get running COM instance and assign it to RCW.Net COM Interop 获取正在运行的 COM 实例并将其分配给 RCW
【发布时间】:2012-04-03 13:19:53
【问题描述】:

我正在创建一个需要与第三方工具 (COM) 互操作的 wpf 应用程序。该工具将首先启动,我将在该工具中提供一些输入。然后他将启动我的 wpf 应用程序,其中将再次给出一些输入。我的 wpf 应用程序需要与正在运行的工具实例进行互操作,并在工具中执行一些方法并将结果传递给我的应用程序。我尝试使用 RCW。但 RCW 只是一个代理。我需要一个正在运行的工具实例来与之交互。谁能帮帮我????????????

编辑:现有的 C++ 代码可以执行此操作,那么如何将其转换为 C#?

bool DisDriver::Create(CLSID clsid, DWORD ClsContext, LPCTSTR ServerName) 
{ 
    hRet = ::CoCreateInstanceEx(clsid,NULL,dwClsContext,strServerName==NULL?NULL:(&svrinfo),1,&multiqi); 

    if(hRet!=S_OK) { 
#ifdef XYDISPDRIVER_DEBUG
         _tprintf(_T("CoCreateInstance failed:"),hRet); 
#endif 
        return false; 
    } 
    pDisp = (IDispatch*)(multiqi.pItf); 

}   

【问题讨论】:

  • 查看运行对象表 (ROT)。如果该工具未在 ROT 中注册,那么您就不走运了。
  • 嗨,本,感谢您的回复。当我尝试使用 Marshal.getactiveobject(programid) 时,它会抛出错误,而不是查看程序的活动对象的 ROT 并返回它。那么这是否意味着这个对象在 ROT 中不存在?还是其他原因?
  • 我也尝试枚举所有正在运行的对象,我无法获得所需的对象
  • 你必须想出另一种方法。例如,第三方工具是否接受插件?您可以通过 COM 启动它,以便您已经拥有数据吗?最后,您可以使用 UI 自动化与该工具进行交互吗? msdn.microsoft.com/en-us/library/ms747327.aspx
  • 我不认为它接受插件。但是另一个 C++ 应用程序已经与使用 Cocreateinstance() 方法通过提供 progid、clsid 和服务器名称参数完成的相同工具进行通信。在 .网也是?

标签: com interop


【解决方案1】:

Type.GetType(prog.id),Activator.CreateInstance(type) 实际上会得到一个 com 程序的运行实例,这是这个问题所必需的。

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多