我在安装程序项目中有一个组件(使用旧的Installshield版本创建)。
MSI中的Class表条目创建正确。但是当安装程序运行时,注册表(LocalServer32)中的条目是使用简短的8.3名称创建的。
我可以做什么,以便注册表中的条目使用完整的32位长文件名?
背后的问题:
我的组件尝试使用文件名找到本地化的DLL。但是当使用8.3文件名启动组件时,GetModuleFilename返回的fielname也是8.3格式。因此,当它只是将DEU附加到名称并将扩展名更改为DLL以定位本地化的DLL时,这有时会失败。我无法修改此组件。 (即,CompenentName.exe尝试查找CompenentNameDEU.dll)
当我手动注册组件(ComponentName.exe -register)时,条目使用完整的长文件名,一切都很完美。
答案 0 :(得分:0)
查看创建的其余注册表项。我怀疑你会发现类似LocalServer32数据项(不是键)的东西,里面有明显的垃圾。如果是这样,会发生什么是8.3名称不用于定位COM服务器。那"垃圾"包含与MSI API一起使用的ProductCode和Component guid的编码,用于定位目标文件,必要时调用修复。
因此,如果这是您所看到的,那么简短的回答是“不要使用Class表”#34;因为它创建了一个MSI链接来查找目标,而不是文件路径。
答案 1 :(得分:0)
解决问题的方法是使用GetLongPathName()
API将路径转换为文件名的长版本。
无论参数是缩短的8.3路径还是已经很长的路径,这都应该有效。