RAD Studio中TRegistry::KeyExists()检测组件ID类注册表项失败问题
问题解答
首先明确:你不需要对合法的GUID格式ID做特殊处理,但你当前使用的组件ID本身存在非法字符,这才是导致KeyExists失效的原因。
- 问题核心:正常Windows注册表Uninstall项中的GUID,每一段只能包含十六进制字符(0-9、A-F,大小写均可),但你用的
{1D30003C-A1G4-22E5-CGSH-833A4E1X1234}里有G、S、X这些非十六进制字符,这显然是复制时出现了错误(比如把数字0看成字母O,或是注册表编辑器显示异常)。 - 解决步骤:
- 重新打开注册表编辑器,定位到
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall路径,找到对应的目标项,仔细核对它的键名,确保复制的是完全正确的GUID。 - 将正确的GUID替换到代码的路径字符串中,不需要额外转义或格式处理——TRegistry的KeyExists方法可以直接识别带大括号的GUID路径,你当前的宽字符串(L前缀)写法是符合RAD Studio 2009 Unicode要求的。
- 重新打开注册表编辑器,定位到
- 额外提示:如果是在64位系统上运行32位程序,默认TRegistry会访问32位注册表分支(Wow6432Node),如果目标项在64位分支下,需要用
OpenKeyEx并指定KEY_WOW64_64KEY权限,但这是后续排查的步骤,先解决GUID的字符错误问题。
修正后的示例代码(假设正确GUID为{1D30003C-A1B4-22E5-CD6F-833A4E1F1234},仅作示例):
TRegistry* reg = new TRegistry(KEY_READ); reg->RootKey = HKEY_LOCAL_MACHINE; // 替换为正确的GUID if (reg->KeyExists(L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{1D30003C-A1B4-22E5-CD6F-833A4E1F1234}")) { ShowMessage("successful"); } reg->CloseKey(); reg->Free();
内容的提问来源于stack exchange,提问作者user706420
相关产品推荐
相关产品推荐

