レジストリ エントリを検索するコードがあります。以下の現在の形式では、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;
}
}
問題と思われるのは最初の行であり、それを引き起こしているのは 2 番目のパラメーターです。これに関するMSDNドキュメントは次のとおりです。
strRegCheck は CString 型です。Windows XP でこれを変更すると、
const LPCWSTR sKey = _T("CLSID\\{2933BF90-7B36-11D2-B20E-00C04F983E60}\\VersionList");
明らかに「sKey」の 2 番目のパラメーターを変更してから、もう一度作業します。
sKey を次のように設定した場合:
const LPCTSTR sKey = strRegCheck.GetBuffer(strRegCheck.GetLength());
それから私は失敗の国に戻ります。興味深いことに、RegEdit を同時に開いていて、探しているキーを開いている場合、失敗することはありません。また、エラー 2 または 87 で失敗しています。
これについて他のスレッドをたくさん読みましたが、決定的な答えはありません。私はこれを完成させるために少し急いでいるので、誰かが私に与えることができる指針は大いに受け入れられるでしょう.