7

我是一名应用程序打包者,试图了解 COM 注册表项 (SelfReg) 如何与 Windows 中的给定 .dll 相互关联。

ProgID's、AppID's、TypeLibs、Extensions & Verbs 都与 CLSID 相关联,对吧?CLSID 是否总是使用 Prog/App ID,或者您可以只使用文件扩展名类吗?哪些位是可选的?

其中一些似乎“像路由器”,其中有两个接口(内部 - .dll)和外部(扩展等)。

这一切如何适应?(SDK 文档对我来说没有意义)

我问,因为这对于使用 Windows Installer 进行应用程序“修复”至关重要(哪些打包程序都是“大”的,但没有任何细节故障,因为它确实是一个编码器)

---编辑:我是否可以安全地假设对于注册的 COM,它必须全部链接回 CLSID 并且不能成为“死胡同”?动词需要扩展而需要 progid 的...

AppId、TypeLibs 和接口呢?它们如何相互关联?

4

3 回答 3

5

首先要意识到,COM dll 自己注册。他们会将所有必需的条目放入注册表中的正确位置。

我认为您关于哪些位是可选的核心问题的答案可能是它们对于不同类型的对象都是可选的。如果自动化对象是可公开创建的,则它们需要 Prog/AppID,但如果它们仅在内部创建则可能不需要,类似地,可以列出不可公开创建的 COM 类。

许多没有自动化接口的 COM 对象(例如微软在 Windows 内部使用的许多 COM 类将没有任何 ProgId,而只会在其 CLSID 下的 HKCR\CLSID 中具有一个条目。

如果我对您的理解正确,您会从安装人员的角度对此感兴趣。我想你需要做的就是要求用户指定哪些 dll 是自注册的,然后调用

regsvr32 dllname.dll

或者

exename.exe /注册服务器

对于进程外服务器。如果出现问题,您只需要调用对立面。

regsvr32 /u dllname.dll

或者

exename.exe /Unregserver

我希望这能回答你的问题。

于 2008-10-17T09:59:41.920 回答
2

我会推荐这本书Inside COM

即使在 COM 的鼎盛时期,它也不是最新的参考资料,但它很好地解释了基础知识,包括所有注册表 goo。另外,我敢打赌,你可以买到真正便宜的二手副本。

我知道这不是一个答案,但记住关于注册表的章节是什么样子的——一个非特定的“它是如何工作的”问题需要一个非常非常长的答案......

于 2008-10-17T22:41:18.997 回答
0

我使用了一个答案,因为评论似乎很有限。不确定 SO 将如何解释这一点(也许我会因为自言自语而被视为生气?)

“它是如何工作的”问题需要一个非常非常长的答案

谢谢 - 我想要实现的是在没有真正成为开发人员的情况下理解这一点 - 这是因为打包者试图将 COM 注册表项与 .dll (在同一组件中)分组的方式,以便应用程序弹性工作。

这意味着从 .dll 的注册中“捕获”COM,并将其在正确的广告表(CLSID、AppID ... ad nauseum)中与包含 .dll 的组件相关联。有时这并不容易看到,有时(我被告知)它可能会破坏应用程序的运行。我被告知 COM不需要是完整的(自引用)。

我仍在努力解决这一切。当然,如果打包程序捕获了所有信息但没有将 COM 信息与 .dll 相关联,则 regkeys 仍然在安装时编写,只是 MSI 在出现问题时不会照看应用程序(这几乎从来没有)

于 2008-10-18T00:19:46.130 回答