背景:
我想从VB6应用程序中提取COM数据,以便我可以正确地注册它(根据Microsoft最佳实践)应用程序.我正在使用WiX 3.0并且heat.exe将不会提取数据(已知的热量问题),我没有准备好访问相关的TLB文件.VB6应用程序没有打开兼容性,因此它会在每次构建时重新生成COM GUID(他们希望应用程序能够与旧版本并行运行.)
我创建了一个C#应用程序,它将从VB6应用程序收集TypeLib,接口和CoClass信息,而无需注册它并创建一个wxs文件供蜡烛使用.我的公司有其他几个这样的旧应用程序,我想使它成为一个更通用的解决方案.
问题:
1.有没有办法从项目或TLB文件中的应用程序中收集"真正的"ProgID(程序员预期的)并且没有注册它?
2.有没有办法在没有注册的情况下从DLL中找出预期的线程模型?(我打算它可以处理所有COM活动项,也可以完成)谢谢.
是和不是。
据我所知,没有通用的方法可以从 typelib 或 COM 服务器中获取 ProgID。
DLL 的入口点DllRegisterServer应该将注册信息写入注册表,而对于 EXE 服务器,它们通常具有具有相同含义的命令行参数。
类型库恰好包含组件中所有接口和组件类的描述,但它们很少包含人类可读的 ProgID。
我能看到并推荐的唯一明确的方法是覆盖 HKCR\CLSID 键以临时指向某个位置,然后调用DllRegisterServer. 由于注册表项覆盖是进程本地的,因此这只适用于进程内 (DLL) 服务器。
有关覆盖注册表项的信息,请参阅http://msdn.microsoft.com/en-us/library/ms724901(v=VS.85).aspx 。
然后检查暂存注册表并查看进行了哪些更改,例如 CLSID<->ProgID 映射、线程模型等。