描述:
对于这个技术我比较好奇:
1.MDI的EXE和二次开发组件我猜应该是两个独立开发的程序.
2.那么这个EXE程序是如何和二次开发COM组件进行联系的呢?
3.Word 有打开文件之前的事件,类似这样的事件又是如何从EXE抛到二次开发接口的组件呢?
......
希望有高手指点一二,最好有点例子.谢谢!!
解决方案1:
2.Word应用程序可以通过MSWord.olb达到后台启动,而且可以链接上已经启动的Word应用程序,这一点又是如何办到呢?
MSWord.olb只是个类型库,你到通过GetActiveObject连接到你的程序,只要通过ole自动提供的RegisterActiveObject注册你程序内部包装的app对象即可,这种逻辑和COM的机制很类似的,先
注册后调用,GetActiveObject等同于COM库提供CoCreateIntance方法,这些都是由ole库提供的
功能,下面是它提供几个方法:
/*---------------------------------------------------------------------*/
/* Active Object Registration API */
/*---------------------------------------------------------------------*/
/* flags for RegisterActiveObject */
#define ACTIVEOBJECT_STRONG 0x0
#define ACTIVEOBJECT_WEAK 0x1
WINOLEAUTAPI RegisterActiveObject(IUnknown * punk, REFCLSID rclsid,
DWORD dwFlags, DWORD * pdwRegister);
WINOLEAUTAPI RevokeActiveObject(DWORD dwRegister, void * pvReserved);
WINOLEAUTAPI GetActiveObject(REFCLSID rclsid, void * pvReserved,
IUnknown ** ppunk);
胡哥,有没有相关资料?
我最近也需要实现类似功能,不过稍有差别。
自己也有一些想法,不过很零散,感觉离一个成功的程序框架还有相当的距离。
office和VS的插件规范是统一的,要求组件实现_IDTExtensibility2接口,你也可以完全模仿它们定义插件也必须实现_IDTExtensibility2接口。
使用方式大致如下:
1、应用程序启动时,扫描注册表中某一个特定的子键,比如Software\yourapp\plugins,枚举其下所有的子键,并寻找某个值(代表组件的CLSID)。
2、按照这个CLSID,调用CoCreateInstance来启动该插件,获得_IDTExtensibility2接口。
3、调用该组件接口的OnConnection方法,给它机会进行初始化。
4、在退出前调用该组件接口的OnDisconnection方法,给它机会进行各种清理工作。
5、调用接口的Release方法释放组件。
6、应用程序退出。
通常,在OnConnection方法里面要传递给插件足够的信息,以便工作过程中插件能利用这些信息执行工作,有条件的话在应用程序中实现一些对象模型供插件使用,在这些对象中提供连接点用于发生某些事件时能通知组件(就像你说的打开文件事件)。当然不用连接点也完全可以。
当然你完全可以不用这套规范,自己设计一个插件接口(比如IxxxPlugin,提供Init和Uninit方法),原理跟上面都是一样的。