什么是压缩GUID以及为什么使用它?

时间:2018-06-06 14:35:45

标签: windows windows-installer

我知道在Windows中,Windows Installer使用GUID检查注册表项onSetupsChange(allSetups: ISetups) { // emitted object from child 1 is assigned to local object this.allSetups = {...allSetups}; } 下已安装的产品,并使用HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\中的压缩GUID存储其他与产品相关的信息

谷歌搜索了解压缩GUID实际上是什么以及为什么两种表单都用于在注册表数据库中保存特定于产品的数据,只显示了从一种表单转换为另一种表单的算法。

显然,压缩的GUID只是以特定方式改变字符的顺序来计算,让我更加困惑为什么这是压缩形式以及为什么以这种方式使用它。

此外,某些来源似乎将GUID称为软件产品的产品代码,而其他来源则专门使用术语产品代码作为压缩GUID的同义词。

我对Windows及其安装程序的内部工作原理并不了解,但希望有人能用我无法找到的信息来启发我。我提前为我平庸的英语道歉。

2 个答案:

答案 0 :(得分:3)

据报道,打包的guid用于节省注册表中的空间。它用于组件ID,所以一旦你开始在系统上获得一百万个组件,我认为他们担心额外的空间使用。它也可能用于阻止人们浏览注册表以查找Windows Installer项而不是使用API​​。它是一个未记录的实现细节,如果有太多人养成使用注册表而不是使用API​​的习惯,那么如果实现更改则会出现问题。因此,将此视为有趣的信息,而不是在应用程序中使用。

Darwin描述符不同 - 它们只是产品代码,组件ID和功能名称的编码。它们出现在各种地方,其中数据组合对于加载COM服务器,启动程序等非常有用。再次,它没有记录,但是如果你想解开它们,你可以在msi.dll上使用LoadLibrary并找到并调用MsiDecomposeDescriptorW正确的参数。

答案 1 :(得分:2)

不确定您在做什么,或者为什么这是您的方案的问题。但是,您提到的GUID - 删除了大括号和破折号的重新排列的GUID - 实际上称为Packed GUIDs。然后还有Compressed GUIDs长度仅为23个字符,主要用于创建Darwin descriptors - 它们是产品代码GUID,功能名称和组件代码GUID的组合。它们用于MSI的广告功能。这是根据Bob Baker的书" InstallShield Developer入门和Windows Installer设置"。

据我所知,打包的GUID 显然用于提高注册表搜索效率。我不熟悉所涉及的确切技术细节。也许Bob或Rob of WiX可以详细说明。

我必须跑步,而不是真正的答案,我稍后会再看一遍。 请详细说明您的问题,详细了解问题实际是什么。作为总结,似乎集体评论表明这个GUID概念是由于注册表空间节省,搜索效率和混淆。

我的建议(如果我理解正确的话):不要尝试直接从注册表中读取打包或压缩的GUID - 而是通过the MSI APICOM / {{ 1}}) - 它应具备你需要用MSI做任何事情的功能。

一些链接

MSI API链接 (非常相似的链接):