我目前正在使用 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/