我想创建一个小应用程序来从注册表中添加和删除用户定义的上下文菜单条目。为此,我需要以某种方式获取任意 DLL 的 CLSID,以便在编写新条目之前备份以前的条目(如果它们存在)。
尽管regsrv32
以某种方式设法创建了这个神奇的数字,但我自己没有找到任何方法来获得这个数字。
我希望有比这更好的东西:
- 扫描注册表以获取 DLL 名称
- 如果没有找到,注册它,再次扫描,然后再次取消注册
如果 DLL 已重命名,我可以看到问题的可能性。
您可以考虑在指定 REGKIND_NONE 的 DLL 上调用LoadTypeLibEx,然后检查通过传回给您的ITypeLib接口获取可用的TypeLibInfo信息。
在MSDN上有一些关于这类事情的信息。这是一个以 VB6 为中心的旧链接,但包含有关以这种方式检查 COM 组件的有用信息。
您可以尝试使用RegOverridePredefKey()来拦截 regsvr32 对注册表所做的事情 - 调用 RegOverridePredefKey(),然后重现 regsvr32 所做的事情 - LoadLibrary() COM 服务器,调用 DllRegisterServer() - 然后检查所做的更改。使用 RegOverridePredefKey(),您将隔离更改,而不是让它们变得持久。