我有一段代码用于查找注册表项。在下面的当前形式中,它在 Vista 和 7 上运行良好,但在 XP 上返回错误代码 2 或 87。
当前代码(在大于 XP 的情况下工作):
dwRet = RegOpenKeyEx( hKeyUsed, strRegCheck, 0, KEY_READ, &hKey ) ;
if ( dwRet == ERROR_SUCCESS )
{
dwRet = RegQueryValueEx( hKey, strRegValue, NULL, NULL, (LPBYTE) PerfData, &cbData );
while ( dwRet == ERROR_MORE_DATA )
{
// Get a buffer that is big enough.
BufferSize += BYTEINCREMENT;
PerfData = (PPERF_DATA_BLOCK) realloc( PerfData, BufferSize );
cbData = BufferSize;
dwRet = RegQueryValueEx( hKey, NULL, NULL, NULL, (LPBYTE) PerfData, &cbData );
}
if ( dwRet == ERROR_SUCCESS )
{
strSourcePath = PerfData->Signature;
return true;
}
}
第一行似乎是问题所在,而第二个参数是导致它的原因。这是关于它的 MSDN 文档:http: //msdn.microsoft.com/en-gb/library/windows/desktop/ms724897 (v=vs.85).aspx
strRegCheck 是 CString 类型。如果在 Windows XP 上,我将其更改为
const LPCWSTR sKey = _T("CLSID\\{2933BF90-7B36-11D2-B20E-00C04F983E60}\\VersionList");
显然改变了'sKey'的第二个参数然后我们再次工作。
如果我将 sKey 设置为:
const LPCTSTR sKey = strRegCheck.GetBuffer(strRegCheck.GetLength());
然后我又回到了失败的土地上。有趣的是,如果我同时打开了 RegEdit,并且打开了我要搜索的密钥,那么它就不会失败。此外,我要么因错误 2 或 87 而失败。
我已经阅读了很多关于此的其他线程,但没有明确的答案。我有点急于完成这项工作,因此任何人都可以给我的任何指示都会受到极大的欢迎。