代碼裡有詳細的注釋,代碼如下:
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"
藍圖如下:
執行讀寫操作的結果:
參考:https://blog.csdn.net/u014532636/article/details/99726677