1

どうしたの?AUVersion の値を取得しようとするとクラッシュします。このキーはレジストリに存在しますが、取得できません。

int main(int argc, char *argv[])
{
    HKEY key;
    if (RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\JavaSoft\\Auto Update\\"), &key) != ERROR_SUCCESS)
    {
        cout << "Unable to open registry key\n\n";
    }

    char path[1024];
    DWORD value_length = 1024;
//here is the crash
    RegQueryValueEx(key, "AUVersion", NULL, (LPDWORD)REG_SZ, (LPBYTE)&path, &value_length);
    cout << "the value read from the registry is: " << path << endl;


    system("pause");
    return 0;
}
4

2 に答える 2

4

その 4 番目のパラメータはLPDWORD、DWORD へのポインタです。通常の整数を取得してポインターにキャストすると、(逆参照されると) クラッシュします。

そのパラメーターは、レジストリ値の型を受け取ります。タイプを知りたくない場合は、NULL に設定してください。

于 2013-03-25T18:25:30.563 に答える
4

への呼び出しには 2 つのエラーがありますRegQueryValueEx()

  • 型パラメーターが書き込まれるため、有効なアドレスである必要がありますが、これはそうではありません。

    (LPDWORD)REG_SZ
    

これがおそらくクラッシュの原因です。

  • &pathする必要がありますpath

への変更:

DWORD type;
RegQueryValueEx(key, "AUVersion", NULL, &type, (LPBYTE) path, &value_length);

の結果をRegQueryValueEx()確認しpathて、データが取り込まれ、後続のコードが初期化された変数を処理していないことを確認する必要があります。

const DWORD result = RegQueryValueEx(key,
                                     "AUVersion",
                                     NULL,
                                     &type,
                                     (LPBYTE) path,
                                     &value_length);

// Check status of the query and ensure it was a string
// that was read.
if (ERROR_SUCCESS == result && REG_SZ == type)
{
    // Success.
}
于 2013-03-25T18:26:25.480 に答える