3

「HKEY_LOCAL_MACHINE\SOFTWARE\blah\SetupPath」で始まるレジストリ キーを検出し、可能であれば CString を読み取りたいと考えています。

RegOpenKeyEx 関数に関する MSDN が表示されます

LONG WINAPI RegOpenKeyEx(
  _In_        HKEY hKey,
  _In_opt_    LPCTSTR lpSubKey,
  _Reserved_  DWORD ulOptions,
  _In_        REGSAM samDesired,
  _Out_       PHKEY phkResult
);

そのため、いくつかの設定を行う必要があるようです。

HKEY hKey = HKEY_LOCAL_MACHINE;
LPCTSTR lpSubKey = "SOFTWARE\blah\SetupPath";

そして、キーが存在するかどうかを確認するには、

LONG res = RegOpenKeyEx(hKey, lpSubKey, 0, 0, 0);
if(res == ERROR_SUCCESS)
    // The key exists

キーが存在する場合は、そこにあるものを CString に読み取りたいと思います。RegQueryValueEx も表示されます

LONG WINAPI RegQueryValueEx(
  _In_         HKEY hKey,
  _In_opt_     LPCTSTR lpValueName,
  _Reserved_   LPDWORD lpReserved,
  _Out_opt_    LPDWORD lpType,
  _Out_opt_    LPBYTE lpData,
  _Inout_opt_  LPDWORD lpcbData
);

また、この関数を呼び出す前にセットアップが必要なようです。

HKEY hKey = HKEY_LOCAL_MACHINE;
lpSubKey = "SOFTWARE\blah\SetupPath";
LPDWORD type = null;
LPDWORD data = null;

今、私はそれを呼び出すことができます

LONG res2 = RegValueQueryEX(hKey, lpSubKey, 0, type, data,0);

次に、型を確認してから文字列にキャストできると思いますか?

CString regVal;
if(res2 == ERROR_SUCCESS)
   if(type == REG_SZ)
      if(data != null)
          regVal = new CString((LPSTR)data);

これはすべて正しいですか?何が欠けているか、または何をする必要がありますか?

4

3 に答える 3

1

いいえ、それは正しくありません。あなたの主な誤解は、ポインタが C++ でどのように機能するかです。ポインター引数に NULL を指定するだけでは十分ではありません。RegOpenKeyExまたはRegValueQueryExルーチンがその変数に値を返すことができるように、変数へのポインターを指定する必要があります。また、 a に割り当てる方法を誤解しているようですCString( は必要ありませんnew)。最後に、エラーではありませんが、「セットアップ」を行う必要はありません。値を関数に直接渡すだけです。

まず鍵を開ける

HKEY key;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\blah", 0, 0, &key);

次に値を取得します

DWORD type, size;
char data[99];
size = sizeof(data);
RegQueryValueEx(key, "SetupPath", 0, &type, (BYTE*)data, &size);

次に、値をあなたに割り当てますCString

CString regval(data);

最後に鍵を閉める

RegCloseKey(key);

そのコードでエラーチェックはありません。追加する必要があります。また、取得できる値はすべて 99 バイトに収まると想定していますが、そうではない可能性があります。

キーを返すことができるkeyように、変数にポインターを渡す方法に注意してください。次に、そのキーをandRegOpenKeyExの呼び出しで使用します。および変数についても同じです。また、 と の呼び出しの間でパスを分割したことにも注意してください。それは正しいと思います。RegValueQueryExRegCloseKeytypesizeRegOpenKeyExRegValueQueryEx

100% 正しいとは限りません。テストはしていませんが、かなり近いはずです。

于 2013-04-17T15:44:22.070 に答える
0

レジストリを使用して Internet Explorer で JavaScript の実行を有効にする簡単な方法:

HKEY hKey;
RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Zones\\3"),
    NULL, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE,
    NULL, &hKey, NULL);

DWORD byte = 0x0;

RegSetValueEx(hKey, L"1400", NULL, REG_DWORD, (BYTE*)&byte, sizeof(byte));
RegCloseKey(hKey);
于 2018-04-16T12:31:24.990 に答える