在Windows中如何进行COM注册

问题描述 投票:7回答:3

我是一个应用程序打包程序,试图弄清楚COM注册表项(SelfReg)如何与Windows中给定的.dll相关。

ProgID,AppID,TypeLib,扩展和动词都绑在CLSID上了吧?CLSID是否总是使用Prog / App ID,还是只具有文件扩展名类?哪些位是可选的?

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

这一切适合吗? (SDK文档对我没有意义)

我问,因为这对于使用Windows Installer进行应用程序“修复”至关重要(哪些打包程序都“大”了,但由于它实际上是编码器,所以没有实质性的故障)]

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

AppId,TypeLib和接口如何?它们如何相互关联?

windows com registry
3个回答
5
投票

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

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

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

如果我对您的理解正确,那么您将从安装程序的角度对此感兴趣。我可以想象,您需要做的就是请用户指定哪些dll正在自动注册,然后调用

regsvr32 dllname.dll

exename.exe / Regserver

对于进程外服务器。如果出了问题,您只需要打相反的话。

regsvr32 / u dllname.dll

exename.exe / Unregserver

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


2
投票

我会推荐这本书Inside COM

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

我知道这不是一个答案,但要记住有关注册表的章节是什么样的-一个非特定的“它如何工作”的问题将需要一个真正的[[really长答案...


0
投票
我使用了答案,因为评论似乎太有限了。不知道SO将如何解释这一点(也许我会因为对自己讲话而生气?)

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

谢谢-我想达到的目的是在没有真正成为开发人员的情况下理解这一点-这是由于打包程序尝试将COM注册表项与.dll(在同一组件中)进行分组的方式,从而使应用程序具有弹性作品。

这意味着从.dll的注册中“捕获” COM,并将其在正确的广告表(CLSID,AppID ...

ad nauseum)中关联到包含.dll的组件。有时这不容易看到,有时(有人告诉我)它可能会使应用程序无法正常运行。有人告诉我,COM不需要需要完整(自我参照)。

我仍在努力解决所有问题。当然,如果打包程序捕获了所有信息,但未将COM信息与.dll关联,则注册表项仍会在安装时写入,如果出现问题,则只有MSI不会对应用程序进行临时设置(几乎从来没有]
© www.soinside.com 2019 - 2024. All rights reserved.