vs插件注册的原理

允我心安 提交于 2020-03-11 12:57:18

之前遇到了关于vs插件在win7注册的问题,后来虽然问题解决了,但是在问题解决过程中思考过一个问题,vs的插件(addin)是如何注册的?

对于简单的操作来说就是调用regsvr32来注册,而本质上就是执行dll的导出函数DllRegisterServer(当然还有反注册的DllUnregisterServer),但我看了通过向导生成的vs插件工程中的对应文件,找到了这两个函数,发现其只是调用CAddinModule,而这个类是继承于CAtlDllModuleT,显然这是一个通用的模板类,而CAddinModule中并没有关于注册的实现方法。但是在调用addin注册后,会至少在如下两个键值上更新:

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\AddIns

HKEY_CURRENT_USER\Software\Microsoft\VSA\8.0\AddIns 

对比注册、反注册,会发现这两个键值会有变化,显然这两个键值应该就是VS判断加载插件的依据,但是在哪里注册上去的呢? 

后来发现工程下有个rgs 文件,其中描述到了这两个特定的键值,但似乎没有主动的调用过这个rgs文件。后来google了一下发现

http://www.cppblog.com/zhouhuishine/articles/26704.html

继而找到http://blog.csdn.net/Feisy/archive/2008/07/10/2634338.aspx

然后就知道了这原来是atl的特性(Registrar)http://msdn.microsoft.com/en-us/library/49tet6k7(VS.80).aspx

到这里就没什么好说的了,已经不完全是vs插件的范畴了,好好看msdn把。 

补充一点:

http://msdn.microsoft.com/en-us/library/66dx3acb(v=VS.80).aspx

如果要使用静态链接的 Registrar解释器,这样程序会增加5k的空间(release下)

并且需要在代码里声明DECLARE_REGISTRY_RESOURCEID来指定的rgs文件资源

 编译时需要将/D_ATL_DLL 变为 /D_ATL_STATIC_REGISTRY

 ps,还能插个图片,有意思

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!