1

我有一段代码用于查找注册表项。在下面的当前形式中,它在 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 而失败。

我已经阅读了很多关于此的其他线程,但没有明确的答案。我有点急于完成这项工作,因此任何人都可以给我的任何指示都会受到极大的欢迎。

4

1 回答 1

0

我发现变量已经逃脱了反斜杠。这些字符串是从文本文件中读入的。我用双反斜杠替换了单个反斜杠,它可以工作。即便如此,谁能向我解释为什么这是因为我想更好地理解。我很想了解 Vista 和 7 是如何工作的,而 XP 却没有。

于 2012-11-26T10:47:55.943 回答