之前遇到了关于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,还能插个图片,有意思
来源:https://www.cnblogs.com/pandawang/archive/2010/11/21/1883400.html