1

私は現在、c++を使用してレジストリを操作する方法を学んでいます。特定のキーに特定の値が存在するかどうかを確認するアプリケーションを作成しました。ただし、アプリケーションはRegEnumValue()に到達するとすぐにクラッシュします。問題が何であるかについてのアイデアはありますか?

コード:

#include <iostream>
#include <windows.h>
#include <Psapi.h>

using namespace std;

bool registerKeyExists(char* key, char* subkey);

int main()
{
    while(true){
        if(registerKeyExists("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", "SynTPEnh")){
            return 0;
        }
    }

    return 0;
}

bool registerKeyExists(char* key, char* subkey){
    HKEY keyEnum;
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, KEY_READ, &keyEnum) == ERROR_SUCCESS){
        char* valueName;
        DWORD valueSize = 100;
        DWORD cbName;
        FILETIME lastFiletime;
        DWORD i = 0;
        DWORD returnCode = ERROR_SUCCESS;
        while(returnCode == ERROR_SUCCESS){
            cout << "This show!" << endl;
            returnCode = RegEnumValue(keyEnum, i, valueName, &valueSize, NULL, NULL, NULL, NULL);
            cout << "This doesn't show!" << endl;
            if(valueName == subkey)
                return true;
            i++;
        }
    }
    return false;
}
4

2 に答える 2

5

値の名前にスペースを指定していません。初期化されていないポインタvalueNameをに渡していますがRegEnumValue()、これは拒否されます(明らかに、アプリをクラッシュさせるため)。代わりに次を試してください。

char valueName[100];
DWORD valueSize = sizeof(valueName);

これにより、戻り値の名前として100文字が予約されます。

文字列値のテストstrcmp()の代わりに使用することもできます。==

if (strcmp(valueName, subkey) == 0) ...
于 2012-05-08T21:21:51.190 に答える
3

RegEnumValue()のSDKドキュメントから:

LONG WINAPI RegEnumValue(
  __in         HKEY hKey,
  __in         DWORD dwIndex,
  __out        LPTSTR lpValueName,         // <=== here
  __inout      LPDWORD lpcchValueName,
  __reserved   LPDWORD lpReserved,
  __out_opt    LPDWORD lpType,
  __out_opt    LPBYTE lpData,
  __inout_opt  LPDWORD lpcbData
);

__outlpValueName引数のSALアノテーションに注意してください。これは、「指定したポインタを介して書き込む」ことを意味します。特に、SDKの記事の残りの部分に記載されているように、値の名前を記述します。

問題は、書き込み可能なメモリを指す初期化されたポインタを渡さなかったことです。次の引数lpcchValueNameで示されるように、文字列を受け取るのに十分な大きさのTCHAR[]配列。初期化されていないままにしました。そして、配列に100文字を割り当てたと言って気を悪くしました。

カブーム。

于 2012-05-08T21:32:10.000 に答える