不注册exe文件,获取COM ProgID

5

背景:

我想从VB6应用程序中提取COM数据,以便按照Microsoft最佳实践正确地注册它。 我正在使用WiX 3.0,但heat.exe无法提取数据(这是heat的已知问题),并且我没有即时访问相关TLB文件的权限。 VB6应用程序没有打开兼容性,因此每次构建时都会重新生成COM GUID(他们希望该应用程序能够与旧版本一起运行)。

我创建了一个C#应用程序,可以从VB6应用程序中收集TypeLib,接口和CoClass信息而无需注册它,并创建wx文件以供candle使用。 我公司还有其他类似的旧应用程序,我想将其变成更通用的解决方案。

问题:

1.是否有一种方法可以在不使用项目或TLB文件以及不注册它的情况下从应用程序中收集“真实”的ProgID(程序员预期的ID)?

2.是否有一种方法可以找出DLL的预期线程模型而无需注册它?(我打算它可以处理所有COM活动项目,那就干脆完整点吧)谢谢。


Visual Studio捆绑的OLE-COM对象查看器可以做到这一点,所以肯定是可能的。好问题!+1 - ParmesanCodice
1
通常通过设置注册表重定向并调用自注册来完成此操作。COM组件不会被注册,我不知道这是否满足问题中“未注册”的部分。我正在使用tallow的修改版本:http://www.unicontsoft.com/upload/tallow/ - wqw
我的意图是看看是否有一种方法可以不调用注册表来实现。我会阅读关于重定向的内容。谢谢。 - mangelo
1个回答

1

是和不是。

据我所知,没有通用的方法从类型库或COM服务器中获取ProgIDs。

DLL的入口点是DllRegisterServer,它应该将注册信息写入注册表中;对于EXE服务器,它们通常有一个具有相同含义的命令行参数。

类型库恰好包含组件中所有接口和coclass的描述,但它们很少包含可读的ProgID。

我唯一能看到并推荐的明确方法是覆盖HKCR \ CLSID键以指向某个临时位置,然后调用DllRegisterServer。由于注册表键覆盖是进程本地的,因此这仅适用于进程内(DLL)服务器。

请参阅http://msdn.microsoft.com/en-us/library/ms724901(v=VS.85).aspx了解有关覆盖注册表键的信息。

然后检查临时注册表并查看所做的更改,例如CLSID<->ProgID映射、线程模型等。


我会查看这个。由于我现在专注于另一个项目,可能需要几天到一周的时间。 - mangelo
我想知道是否可能我已经引导你走了偏路...更仔细地看,RegOverridePredefKey只在当前进程中覆盖(出于明显的原因),所以你不能使用它来收集可执行文件的注册数据。我正在编辑我的答案以反映这一点。 - Kim Gräsman
截至2021年7月有关此事有任何更新吗?现在是否有API可以做到这一点?我可以使用LoadTypeLib从COM DLL中获取大多数其他内容,只是获取不到ProgID。 - Adrian S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接