RegOpenKeyEx仅在Windows XP上失败

时间:2012-11-23 14:21:56

标签: c++ visual-c++ registry

我有一段代码可以查找注册表项。在目前的形式下,它在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.

我已阅读其他线程的负载,但没有确定的答案。我有点急于完成任务,所以任何人都能给我的任何指针都会受到极大的欢迎。

1 个答案:

答案 0 :(得分:0)

我发现变量已经转义为反斜杠。这些字符串是从文本文件中读取的。我替换了单反的双反斜杠,它的工作原理。即便如此,任何人都可以向我解释为什么这是因为我想更好地理解。我非常想了解Vista和7是如何工作的,而XP则不然。