簡體   English   中英

讀寫注冊表項。 C ++ MFC MBCS。

[英]Reading and Writing registry keys. C++ MFC MBCS.

我想檢測,如果可能的話,讀取CString,一個以“HKEY_LOCAL_MACHINE \\ SOFTWARE \\ blah \\ SetupPath”開頭的注冊表項。

我在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);

這都是正確的嗎? 我可能缺少什么或需要做什么?

不,這不正確。 你的主要誤解是指針在C ++中是如何工作的。 為指針參數提供NULL是不夠的,您必須提供指向變量的指針,以便RegOpenKeyExRegValueQueryEx例程可以向該變量返回一個值。 您似乎也誤解了如何分配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變量,以便RegOpenKeyEx可以返回鍵。 然后我在調用RegValueQueryExRegCloseKey使用該鍵。 typesize變量相同。 另請注意,我已經拆分了對RegOpenKeyExRegValueQueryEx的調用之間的路徑。 認為這是正確的。

不是100%肯定這是正確的,我沒有測試它,但應該更接近。

這都是正確的嗎? 我可能缺少什么或需要做什么?

除了約翰的回答,我建議做一些修改:

  1. 傳遞KEY_READ | KEY_QUERY_VALUE KEY_READ | KEY_QUERY_VALUE作為RegOpenKeyEx訪問權限掩碼,如果您只是要讀取密鑰。

  2. 如果緩沖區大小太小, RegQueryValueEx可能會返回ERROR_MORE_DATA 除非您事先知道數據的大小,否則您可能希望在循環中調用它。

使用注冊表在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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM