天天看點

UE4 操作windows系統資料庫(UE4 C++筆記)

代碼裡有詳細的注釋,代碼如下:

AOperationRegActor.h

UCLASS()
class NEWWINDOW_API AOperationRegActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AOperationRegActor();

	//讀取系統資料庫中的鍵值
	UFUNCTION(BlueprintPure, Category = Reg)
	FString ReadRegValue(const FString& PathDir, const FString& KeyName, bool& bIsFind);

	//寫入系統資料庫中的鍵值,如果沒有就會建立
	UFUNCTION(BlueprintCallable, Category = Reg)
	bool WriteRegValue(const FString &PathDir, const FString &KeyName, const FString &Value);

	//删除系統資料庫中的鍵
	UFUNCTION(BlueprintCallable, Category = Reg)
	bool DeleteRegKey(const FString &PathDir, const FString &KeyName);

private:
	//打開鍵值的最大位元組數
	static const int32 MaxBuffsize;
};
           

AOperationRegActor.cpp 

//初始化
const int32 AOperationRegActor::MaxBuffsize= 64;

// Sets default values
AOperationRegActor::AOperationRegActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

FString AOperationRegActor::ReadRegValue(const FString& PathDir, const FString& KeyName, bool& bIsFind)
{
	HKEY hKey;

	/*
	RegOpenKeyEx(                    //傳回值為零(ERROR_SUCCESS)表示成功。其他任何值都代表一個錯誤代碼
	_In_ HKEY hKey,                  //要打開的鍵的句柄,通常是主(根)鍵
	_In_opt_ LPCWSTR lpSubKey,       //要打開的子鍵的位址,指向包含了要打開鍵的名字的以空字元結束的字元串,
									   這個鍵必須是能被hKey參數識别的子鍵,通常是子鍵的路徑位址

	_In_opt_ DWORD ulOptions,        //參數作用不明确,系統保留,指定為0
	_In_ REGSAM samDesired,          //打開權限:KEY_READ(隻讀子鍵),KEY_ALL_ACCESS(允許所有權限)
	_Out_ PHKEY phkResult            //傳回打開句柄
	);
	*/
	if (RegOpenKeyEx(HKEY_CURRENT_USER, *PathDir, 0, KEY_WOW64_64KEY | KEY_READ, &hKey) == 0)
	{
		TCHAR Buffer[MaxBuffsize];
		DWORD BufferSize = sizeof(Buffer);

		/*
		WINADVAPI
		LSTATUS
		APIENTRY
		RegQueryValueExW(                     //傳回值為零(ERROR_SUCCESS)表示成功。其他任何值都代表一個錯誤代碼
		_In_ HKEY hKey,                       //一個已打開項的句柄,或者指定一個标準鍵值項名  
		_In_opt_ LPCWSTR lpValueName,         //要擷取值的鍵值項(Key)的名稱
		_Reserved_ LPDWORD lpReserved,        //參數作用不明确,指定為0
		_Out_opt_ LPDWORD lpType,             //用于裝載取回資料類型的一個變量
		_Out_writes_bytes_to_opt_(*lpcbData, *lpcbData) __out_data_source(REGISTRY) LPBYTE lpData,    // 用于裝載指定值的一個緩沖區
		_When_(lpData == NULL,_Out_opt_) _When_(lpData != NULL,_Inout_opt_) LPDWORD lpcbData          //用于裝載lpData緩沖區長度的一個變量。一旦傳回,
																										它會設為實際裝載到緩沖區的位元組數
		);
		*/
		HRESULT hResult = RegQueryValueEx(hKey, *KeyName, 0, nullptr, reinterpret_cast<LPBYTE>(Buffer), &BufferSize);
		RegCloseKey(hKey);
		if (hResult != 0)
		{
			return FString(TEXT("Find'n Key"));
		}
		bIsFind = true;
		return FString(Buffer);
	}

	return FString(TEXT("Find'n Reg"));
}

bool AOperationRegActor::WriteRegValue(const FString &PathDir, const FString &KeyName, const FString &Value)
{
	bool bSuccess = false;
	HKEY hRootKey;

	/*
	RegCreateKeyEx(                       //傳回值為零(ERROR_SUCCESS)表示成功。其他任何值都代表一個錯誤代碼
	_In_ HKEY hKey,                       //要打開的鍵的句柄,通常是主(根)鍵
	_In_ LPCWSTR lpSubKey,                //要打開的子鍵的位址,指向包含了要打開鍵的名字的以空字元結束的字元串,
											這個鍵必須是能被hKey參數識别的子鍵,通常是子鍵的路徑位址
	_Reserved_ DWORD Reserved,            //參數作用不明确,指定為0
	_In_opt_ LPWSTR lpClass,              //定義子鍵類名,通常設為nullptr
	_In_ DWORD dwOptions,                 //建立子鍵時的選項
	_In_ REGSAM samDesired,               //權限
	_In_opt_ CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes,     //指向SECURITY_ATTRIBUTES結構,指定鍵句柄的繼承性,通常設為nullptr
	_Out_ PHKEY phkResult,                                         //傳回建立句柄
	_Out_opt_ LPDWORD lpdwDisposition                              //通常設為nullptr
	);

	如果這個鍵在系統資料庫中已經存在,這個函數打開它。
	*/
	if (RegCreateKeyEx(HKEY_CURRENT_USER, *PathDir, 0, nullptr, REG_OPTION_NON_VOLATILE, KEY_WOW64_64KEY | KEY_ALL_ACCESS, nullptr, &hRootKey, nullptr) == 0)
	{
		/*
		WINADVAPI
		LSTATUS
		APIENTRY
		RegSetValueEx(                    //傳回值為零(ERROR_SUCCESS)表示成功。其他任何值都代表一個錯誤代碼
		_In_ HKEY hKey,                   //一個已打開項的句柄,或者指定一個标準鍵值項名
		_In_opt_ LPCWSTR lpValueName,     //要設定的鍵值項(Key)的名位址
		_Reserved_ DWORD Reserved,        //參數作用不明确,指定為0
		_In_ DWORD dwType,                //鍵值Vlaue的類型
		_In_reads_bytes_opt_(cbData) CONST BYTE* lpData,          //鍵值Vlaue
		_In_ DWORD cbData                                         //鍵值Vlaue長度
		);



		使用這個函數的時個有一點需要注意,其中參數lpDate和cbDate的值要跟據dwType的值來設定,按常用設定我們分三種情況

		(1)當dwType為REG_SZ時,這時跟通常一樣,lpDate為要設定的資料, cbDate為資料的長度。

		(2)當dwType為REG_DWORD 時,cbDate必須設為4。

		(3)當dwType為REG_BINARY 時,cbDate也必須設為4。

		如果調用時,鍵值項名稱已經存在,則會覆寫原有鍵值項。如果沒有就建立一個。
		*/
		LRESULT Result = RegSetValueEx(hRootKey, *KeyName, 0, REG_SZ, (const BYTE*)*Value, (Value.Len() + 1) * sizeof(TCHAR));
		RegCloseKey(hRootKey);

		if (Result == ERROR_SUCCESS)
		{
			bSuccess = true;
		}
	}
	return bSuccess;
}

bool AOperationRegActor::DeleteRegKey(const FString &PathDir, const FString &KeyName)
{
	bool bSuccess = false;
	HKEY hKey;

	if (RegOpenKeyEx(HKEY_CURRENT_USER, *PathDir, 0, KEY_WOW64_64KEY | KEY_READ, &hKey) == 0)
	{
		/*
		WINADVAPI
		LSTATUS
		APIENTRY
		RegDeleteKey (                  //傳回值為零(ERROR_SUCCESS)表示成功。其他任何值都代表一個錯誤代碼
		_In_ HKEY hKey,                 //一個已打開項的句柄,或者指定一個标準鍵值項名
		_In_ LPCWSTR lpSubKey           //要設定的鍵值項(Key)的名位址
		);
		*/

		LRESULT Result = RegDeleteKey(hKey, *KeyName);
		RegCloseKey(hKey);
		if (Result == 0)
		{
			bool bRes = true;
			return bRes;
		}
	}
	return bSuccess;
}
           

AOperationRegActor.cpp額外包含的頭檔案 

#include "AllowWindowsPlatformTypes.h"
#include <winreg.h>
#include "HideWindowsPlatformTypes.h"
           

藍圖如下:

UE4 操作windows系統資料庫(UE4 C++筆記)

執行讀寫操作的結果:

UE4 操作windows系統資料庫(UE4 C++筆記)
UE4 操作windows系統資料庫(UE4 C++筆記)

 參考:https://blog.csdn.net/u014532636/article/details/99726677

繼續閱讀