2 qq314377460 qq314377460 于 2015.07.13 22:13 提问

如何在C#中监听COM组件(非托管)中对象启动事件?

诸位前辈,晚上好:

  我是一名硬件工程师,最近使用原理图绘图工具时发现有些功能不好用,就准备自己开发插件增强一下,其中遇到了这样一个问题:
  我在 C# 项目中加入 COM 组件的引用,原理图程序的 COM 对象是 ViewDraw,在其启动时,会创建一个 ViewDraw.Application 的对象,这个对象中有一些子成员和方法,以及一些事件。我现在通过以下方法已经可以做到此原理图程序启动后获取此活动对象:
  

 ViewDraw.Application app = (ViewDraw.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("ViewDraw.Application");

  并且可以通过此 app 对象注册一干事件等达到我想要的目的,但这种方法要求此原理图程序必须先于我的 .NET 程序运行才行,否则就因为创建不了对象而进入引用异常。
  因为我对 COM 模型不熟悉,且也是个半酱油的程序选手,搜索尝试了一些方法,并未成功;想请教诸位前辈,如何能够让我的程序先启动时候,监视这个 COM 对象的创建,比如注册个事件,当其创建时触发此事件。
  后辈在此拜谢。

5个回答

devmiao
devmiao   Ds   Rxr 2015.07.13 22:17

你说的这个不是com而是进程外的com
http://stackoverflow.com/questions/25299133/get-com-dcom-connections

qq314377460
qq314377460 这个 COM 对象是本机的一个进程,其启动后会创建一个对象,现在我想要的就是监控这个对象,其创建后我的程序可以注册一些事件,进而完成一些自动化的工作。
2 年多之前 回复
qq314377460
qq314377460 感谢关注和回答:此链接描述的更倾向于监控端口,而不是说明监控一个对象……
2 年多之前 回复
oyljerry
oyljerry   Ds   Rxr 2015.07.13 22:39

你的程序可以直接CoCreateInstance创建com对象实例。如果对应com进程不存在,系统会帮你启动。如果启动了,就会创建对象成功。

qq314377460
qq314377460 回复oyljerry: 说到点子上了,这软件需要配置一堆东西才会支持外部插件,很是繁琐,而且很容易就 BUG 了,所以才想这种办法。
2 年多之前 回复
oyljerry
oyljerry 回复烟花乱长安: 你这看上去更像工具应该提高插件支持,它启动了就会加载你的插件
2 年多之前 回复
qq314377460
qq314377460 感谢关注和回复:但我想要做到的是这个程序作为服务,并不是建立启动依赖;当用户不启动此原理图工具时,我的程序作为“伺服”静默存在,直到用户启动原理图绘制工具,COM 对象存在,再开始加载组件提供服务。
2 年多之前 回复
qq314377460
qq314377460 感谢关注和回复:但我想要做到的是这个程序作为服务,并不是建立启动依赖;当用户不启动此原理图工具时,我的程序作为“伺服”静默存在,直到用户启动原理图绘制工具,COM 对象存在,再开始加载组件提供服务。
2 年多之前 回复
qq314377460
qq314377460   2015.07.13 23:04

补充说明一下,此对象 ViewDraw.Application 自带了 Startup 事件,但是我没绕过这个弯:

我注册这个事件,必须先要有一个 ViewDraw.Application 对象,而有了这个对象,我还要 Startup 方法干什么……

frank_20080215
frank_20080215   2015.07.13 23:05

进程外的com,那直接写代码。和C#没什么大关系。

qq314377460
qq314377460 感谢关注和回复:恕我没看懂;如果不启动这个程序,如何操纵对象?
2 年多之前 回复
frank_20080215
frank_20080215   2015.07.13 23:14

写一段powershell脚本启动

qq314377460
qq314377460 感谢再次回答:您的回复启发了我,可以监视这个原理图程序的进程,但是这么做会耗费很多不必要的资源开销……期待更好的回答
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片