c# - 通过 Windows 进程句柄访问 COM 对象

标签 c# com interop

我目前正在使用 COM 自动化工作中的应用程序,并且遇到一个问题:如果在我的应用程序运行时原始应用程序已打开,则任何使用我的应用程序的人都会遇到问题。我知道如何找到打开的进程,但不必担心关闭它或解决它等问题,我想尝试使用现有的应用程序而不是打开一个新的应用程序。

这是我通常在自动化程序中启动应用程序的方式:

Designer.Application desApp = new Designer.Application();

现在我尝试尝试使用现有应用程序中的句柄:

Designer.Application desApp = (Designer.Application)((System.Diagnostics.Process.GetProcessesByName("Designer.exe")[0]).Handle)

(我知道这不起作用,因为 .Handle 返回一个 IntPtr,但我使用它作为示例。)

有什么办法可以实现这一点吗?如果我知道句柄/进程,如何返回可用对象?

最佳答案

附加到现有自动化对象的 COM 方式检索运行对象表 (ROT) 的对象 http://msdn.microsoft.com/en-us/library/ms695276(VS.85).aspx .

您可以使用 IRunningObjectTable 接口(interface)在 ROT 中注册 COM 对象。 http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comtypes.irunningobjecttable.aspx

并用于在 ROT 中查询对象的现有实例。例如,System.Runtime.InteropServices.Marshal.GetActiveObject。

关于c# - 通过 Windows 进程句柄访问 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2746611/

相关文章:

c# - 在 C# 中从字符串到日期解析?

delphi - 识别/列出来自第三方软件的 COM 对象和属性

c++ - ATL CComPtr 附加、分离和析构函数

c# - 多线程应用中静态全局非托管资源的管理

c# - 我需要固定匿名代表吗?

c# - 即使在方法完成后线程如何访问局部变量?

c# - 需要 LINQ 表达式根据外键值过滤表

c# - ASP.NET MVC4 ... "BIN"是保留关键字吗?

c++ - 在控制台应用程序中使用 COM 方法

c# - 在 Web 浏览器控件中控制 Excel