16

C++ を使用して Windows レジストリに新しいレジストリ キーを作成しようとしています。これが私がこれまでに持っているコードです:

HKEY hKey;
    LPCTSTR sk = TEXT("SOFTWARE\\OtherTestSoftware");

    LONG openRes = RegCreateKeyEx(
            HKEY_LOCAL_MACHINE,
            sk,
            0,
            NULL,
            REG_OPTION_BACKUP_RESTORE,
            KEY_ALL_ACCESS,
            NULL,
            &hKey,
            NULL);

    if (openRes==ERROR_SUCCESS) {
        printf("Success creating key.");
    } else {
        printf("Error creating key.");
    }

    LPCTSTR value = TEXT("OtherTestSoftwareKey");
    LPCTSTR data = "OtherTestData\0";

    LONG setRes = RegSetValueEx (hKey, value, 0, REG_SZ, (LPBYTE)data, strlen(data)+1);

    if (setRes == ERROR_SUCCESS) {
        printf("Success writing to Registry.");
    } else {
        printf("Error writing to Registry.");
    }

    //RegDeleteKey(hKey, sk);

    LONG closeOut = RegCloseKey(hKey);

    if (closeOut == ERROR_SUCCESS) {
        printf("Success closing key.");
    } else {
        printf("Error closing key.");
    }

非常によく似たコード スニペットを使用して、既存のキーを正常に開くことができます (基本的に RegCreateKeyEx を RegOpenKeyEx に置き換えます)。RegCreateKeyEx に渡す引数の 1 つ以上が問題を引き起こしていると思います。私がトラップしたすべてのエラーコードが成功を示しているため、どこで問題が発生している可能性があるかは正直わかりません。参考までに、RegCreateKeyEx の関数シグネチャを次に示します。

/*
 * LONG WINAPI RegCreateKeyEx(
      __in        HKEY hKey,
      __in        LPCTSTR lpSubKey,
      __reserved  DWORD Reserved,
      __in_opt    LPTSTR lpClass,
      __in        DWORD dwOptions,
      __in        REGSAM samDesired,
      __in_opt    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
      __out       PHKEY phkResult,
      __out_opt   LPDWORD lpdwDisposition
    );
 */

どんな考えでも素晴らしいでしょう!

ありがとう、ブライアン

4

4 に答える 4

15

私は何年もの間、独自の関数ライブラリをコンパイルしてきました。この一部は、レジストリ アクセスを完全に処理します。Registry.Cpp ファイルの CreateRegistryKey 関数を参照してください

興味がある場合は、ここでライブラリ全体を入手できます。

于 2009-02-03T20:58:10.197 に答える
3

既に述べたようREG_OPTION_BACKUP_RESTOREに、 への呼び出しでオプションを指定しましRegCreateKeyExた。つまり、バックアップまたは復元を実行するためにキーを開いているということです。通常は、REG_OPTION_NON_VOLATILE代わりに使用します。

実行しているオペレーティング システムは何ですか? Windows 2000/XP では、HKEY_LOCAL_MACHINE管理者以外のユーザーはレジストリ ハイブに書き込みできないためRegCreateKeyEx、アクセス拒否エラー (エラー 5) で失敗します。requestedExecutionLevelアプリケーションのマニフェストにエントリがある場合、これは Vista にも適用されます。Vista を実行していて、アプリケーションで が指定requestedExecutionLevelされていない場合 (またはマニフェストがまったくない場合)、へのアクセスHKEY_LOCAL_MACHINEは仮想化されるため、RegCreateKeyEx成功するはずです。詳細については、MSDN の「Windows Vista でのレジストリの仮想化」を参照してください。

UNICODE投稿したコードにはさらにいくつかの問題があります。これは、プロジェクトを定義済みでコンパイルした場合にのみ明らかになります。この行:

LPCTSTR data = "OtherTestData\0";

する必要があります

LPCTSTR data = TEXT("OtherTestData\0");

そしてこの行:

LONG setRes = RegSetValueEx(hKey, value, 0, REG_SZ,
    (LPBYTE)data, _tcslen(data)+1);

次のようにする必要があります。

LONG setRes = RegSetValueEx(hKey, value, 0, REG_SZ,
    (LPBYTE)data, (_tcslen(data)+1) * sizeof(TCHAR));

cbDataパラメーターRegSetValueExは、文字ではなくバイト単位のデータの長さであるためです。

これが役立つことを願っています!

于 2009-02-03T20:56:22.073 に答える
2

最初の手がかりは、の使用ですREG_OPTION_BACKUP_RESTORE。事前に有効にする必要がある特別な「バックアップ」特権が必要であると私は信じているので、おそらくそのフラグを使用したくないでしょう。通常のアプリケーションはそれをしたくないでしょう。

于 2009-02-03T19:54:24.320 に答える
0

おそらくこれが、コードで新しいキーを作成できない理由です。

これらのリンクが役立つ場合があります。

http://www.codeguru.com/forum/archive/index.php/t-378884.html
http://www.codeguru.com/forum/archive/index.php/t-275250.html

補足として、常に GetLastError() を試してエラー メッセージを取得してください。

どちらもテストしていません。

于 2011-05-30T12:03:03.667 に答える