【发布时间】: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 和服务器名称参数完成的相同工具进行通信。在 .网也是?