const char* Launcher::GetProjectName()
{
PVOID data;
LPDWORD pcbData;
HKEY OpenResult;
LSTATUS status = RegOpenKeyEx(HKEY_CURRENT_USER, L"Environment", NULL, KEY_READ, &OpenResult);
if (status != ERROR_SUCCESS)
{
LOG(ERROR) << "Could not found registry key 'Environment'";
}
else
{
LPCWSTR project_name_key = L"project_name";
DWORD data_type;
WCHAR value[255];
PVOID pvData = value;
DWORD size = sizeof(value);
status = RegGetValue(OpenResult, NULL, project_name_key, RRF_RT_ANY, &data_type, pvData, &size);
if (status != ERROR_SUCCESS)
{
LOG(ERROR) << "Could not found registry value 'project_name'";
}
else
{
switch (data_type)
{
case REG_DWORD:
wprintf(L"Value data: %x\n", *(DWORD*)pvData);
break;
case REG_SZ:
wprintf(L"Value data: %s\n", (PWSTR)pvData);
}
}
RegCloseKey(OpenResult);
}
return 0;
}
我正在嘗試獲取我制作的名為“project_name”的注冊表項,并將其作為 achar*或std::string. 但是,我在 pvData 中獲取垃圾資料。我在這里做錯了什么?我看過其他一些 stackoverflow 帖子,并嘗試復制他們的設定,但沒有任何效果。我的整個目標是使用 Windows 注冊表檢索環境變數。
uj5u.com熱心網友回復:
我認為 ANSI 和 Unicode 的期望不匹配。您的代碼可能正在為 ANSI 編譯,但您傳遞的是寬字符緩沖區。讓我們明確地呼叫A注冊表函式的版本,這樣您就可以留在 ANSI 字串空間中。
而不是這個:
WCHAR value[255];
PVOID pvData = value;
DWORD size = sizeof(value);
status = RegGetValue(OpenResult, NULL, project_name_key, RRF_RT_ANY, &data_type, pvData, &size);
用這個:
char value[255];
DWORD size = sizeof(value);
status = RegGetValueA(OpenResult, NULL, project_name_key, RRF_RT_ANY, &data_type, value, &size);
然后,回傳 astd::string如下:
宣告你的函式回傳一個字串,而不是一個指標:
const std::string Launcher::GetProjectName()
然后簡單地value以字串形式回傳;
return std::string(value);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/411743.html
標籤:
下一篇:為什么GetDC功能不起作用?
