我是一个应用程序打包器,试图弄清楚COM注册表项(SelfReg)如何与Windows中的给定.dll相互关联。
ProgID,AppID,TypeLibs,Extensions&动词都与CLSID绑在一起吗? CLSID总是使用Prog / App ID,还是只有文件扩展类? 哪些位是可选的?
其中一些似乎是“像路由器”,其中有两个接口(内部 - .dll)和外部(扩展等)。
这一切如何适合? (SDK文档对我没有意义)
我问,因为这对于使用Windows Installer的应用程序“愈合”来说至关重要(其中包装器都是'大',但是因为它真的是编码器,所以没有任何实质性的故障)
---编辑: 我是否可以安全地假设COM已注册,它必须全部链接回CLSID并且不能是“死胡同”? 动词需要扩展,需要progid的...
AppId,TypeLibs和Interfaces怎么样?他们如何相互关联?
答案 0 :(得分:4)
首先要意识到的是,COM dlls会自行注册。他们会将所有必需的条目放入注册表中的正确位置。
我认为关于哪些位是可选的核心问题的答案可能是它们对于不同类型的对象都是可选的。如果自动化对象是可公开创建的,则它们需要Prog / AppID,但如果它们仅在内部创建,则可能不会,类似地,可以列出非公开创建的COM类。
许多没有自动化接口的COM对象(例如微软在Windows内部使用的许多COM类都不会有任何ProgId,但只会在HKCR \ CLSID的CLSID下有一个条目。
如果我理解正确,您会从安装人员的角度对此感兴趣。我想你要做的就是让用户指定哪些dll是自我注册的,然后调用
regsvr32 dllname.dll
或
exename.exe / Regserver
用于进程外服务器。如果出现问题,你只需要调用对立面。
regsvr32 / u dllname.dll
或
exename.exe / Unregserver
我希望这能回答你的问题。
答案 1 :(得分:1)
我推荐这本书Inside COM。
即使在COM全盛时期,它也不是最新的参考,但它很好地解释了基础知识,包括所有注册表goo 。另外,我打赌你可以得到一个真正便宜的二手副本。
我知道这不是一个答案,但是记住关于注册表的章节是什么样的 - 一个非特定的“它是如何工作”的问题将需要一个非常真正长的答案。 ..
答案 2 :(得分:0)
我使用了答案,因为评论似乎非常有限。不确定SO会如何解释这一点(也许我会因为与自己交谈而感到生气?)
“它是如何工作的”问题将需要一个非常非常长的答案
谢谢 - 我正在努力实现的目标是理解它而不是实际上是开发人员 - 这是因为打包程序尝试使用.dll(在同一组件中)对COM注册表项进行分组以便应用程序弹性有效。
这意味着从.dll的注册中“捕获”COM并将其与正确的广告表(CLSID,AppID ... ad nauseum )关联到包含.dll的组件。有时这不容易看到,有时(我被告知)它可能会破坏应用程序的运行。我被告知COM不会需要完成(自我指涉)。
我仍然试图全身心投入。 当然,如果打包器捕获所有信息但没有将COM信息与.dll相关联,则仍然会在安装时写入regkey,如果出现问题,MSI不会对应用程序进行测试(其中几乎从不)