1. 程式人生 > 其它 >Windows程式設計(操作登錄檔)

Windows程式設計(操作登錄檔)

Windows程式設計(操作登錄檔)

登錄檔 儲存在二進位制檔案裡面, win32 API 提供了大量的函式操作登錄檔

RegCreateKey 建立指定的登錄檔項

RegCreateKeyW(
_
In_ HKEY hKey, //開啟的當前項的控制代碼 實際上就是那幾個分支
_
In_opt_ LPCWSTR lpSubKey,//開啟或者建立的表項的名稱
_
Out_ PHKEY phkResult //用來接收建立或者開啟表項控制代碼 regclosekey
);
RegOpenKeyW(
_In_ HKEY hKey, //開啟的當前項的控制代碼 實際上就是那幾個分支
_
In_opt_ LPCWSTR lpSubKey,
_Out_ PHKEY phkResult
);

HKEY_CLASSES_ROOT

HKEY_CURRENT_CONFIG

HKEY_CURRENT_USER

HKEY_LOCAL_MACHINE

HKEY_USERS

寫登錄檔

RegSetValueW(
_In_ HKEY hKey, //開啟的當前項的控制代碼 實際上就是那幾個分支
_In_opt_ LPCWSTR lpSubKey, //開啟或者建立的表項的名稱
_In_ DWORD dwType, //指示被儲存資訊的型別 REG_SZ型別
_
In_reads_bytes_opt_(cbData) LPCWSTR lpData,//要存放到登錄檔裡面的數
據
_
In_ DWORD cbData //要存放的字串資料的大小、 長度
);


RegSetValueExW(
_
In_ HKEY hKey, //開啟的當前項的控制代碼 實際上就是那幾個分支
_In_opt_ LPCWSTR lpValueName,//指向一個字串的指標, 包含了將要設定
值的名稱
_
Reserved_ DWORD Reserved,// 保留引數 0
_In_ DWORD dwType,//REG_BINARY
_In_reads_bytes_opt_(cbData) CONST BYTE * lpData,
_
In_ DWORD cbData
);

查詢登錄檔

RegQueryValueW(
_
In_ HKEY hKey,
_In_opt_ LPCWSTR lpSubKey,
_Out_writes_bytes_to_opt_(*lpcbData, *lpcbData) __out_data_source(REGISTRY)
LPWSTR lpData,
_Inout_opt_ PLONG lpcbData
);

該api中有三個出參。內容分別是資料、資料型別、資料

建立與寫入登錄檔

    {
	{
		DWORD DWage = 20;
		HKEY  hKey;
		 RegCreateKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Rock\\admin", &hKey);
	
			MessageBox(NULL, L"建立登錄檔成功", 0);
			int ret = ::RegSetValueEx(hKey, L"age", 0, REG_DWORD, (CONST BYTE*) & DWage, 4);
			if (ret != ERROR_SUCCESS) {
				MessageBox(NULL,L"寫登錄檔失敗", 0);


			}
			MessageBox(NULL,L"寫登錄檔成功", 0);
		
		::RegCloseKey(hKey);
	}

}


查詢登錄檔

{
	HKEY hKey;
	DWORD dwAge;
	//建立登錄檔項  VS2019自帶的偵錯程式管理員許可權執行  自己的生成是以使用者的許可權執行
	int ret = ::RegOpenKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Rock\\admin", &hKey);
	if (ret != ERROR_SUCCESS)
	{
		TRACE("##RegOpenKeyW Failed ,ErrorCode = %d,ret = %d", GetLastError(), ret);
		MessageBox(L"開啟登錄檔失敗");
		return;
	}

	//寫登錄檔
	DWORD dwType;
	DWORD dwValue;
	ret = ::RegQueryValueEx(hKey, L"age", 0, &dwType, (LPBYTE)&dwAge, &dwValue);
	if (ret != ERROR_SUCCESS)
	{
		TRACE("##RegQueryValueEx Failed ,ErrorCode = %d,ret = %d", GetLastError(), ret);
		MessageBox(L"讀登錄檔失敗");
		return;
	}

	TRACE("###dwType = %d,dwValue = %d ,dwAge = %d", dwType, dwValue, dwAge);
	::RegCloseKey(hKey);
	
}

實際上除此外還有更底層的API能操作登錄檔