我首先要說我絕不是 C 專家,因此非常感謝任何指標/提示。我在從注冊表讀取和寫入時遇到一些困難,同時保留變數,即不擴展它們。我正在嘗試將我的可執行路徑附加到 PATH 環境變數(永久),但我遇到了各種各樣的問題。我有一個長 PATH 變數,如果不使用程式或 regedit 就無法進行編輯,因此我選擇使用當前的 PATH 變數創建一個“OldPath”變數,并將我的 PATH 變數更改為 %OldPath%。這效果很好,但是現在當我嘗試使用 C 對其進行寫入時,%OldPath% 會擴展為舊路徑變數,因此該變數會被截斷。
我首先嘗試使用普通字串,但最終我的 PATH 變數中出現了看起來像中文符號的內容,因此我將其更改為 wstring。現在我得到了正常的字串,但字串在 1172 個字符處被截斷。
我想要的最終結果是 PATH 設定為%OldPath;<current_path>
get_path_env()
inline std::wstring get_path_env()
{
wchar_t* buf = nullptr;
size_t sz = 0;
if (_wdupenv_s(&buf, &sz, L"PATH") == 0 && buf != nullptr)
{
std::wstring path_env = buf;
free(buf);
return path_env;
}
return L"";
}
set_permanent_environment_variable()
inline bool set_permanent_environment_variable()
{
const std::wstring path_env = get_path_env();
if (path_env == L"")
{
return false;
}
std::wstringstream wss;
wss << path_env;
if (path_env.back() != ';')
{
wss << L';';
}
wss << std::filesystem::current_path().wstring() << L'\0';
const std::wstring temp_data = wss.str();
HKEY h_key;
const auto key_path = TEXT(R"(System\CurrentControlSet\Control\Session Manager\Environment)");
if (const auto l_open_status = RegOpenKeyExW(HKEY_LOCAL_MACHINE, key_path, 0, KEY_ALL_ACCESS, &h_key); l_open_status == ERROR_SUCCESS)
{
const auto data = temp_data.c_str();
const DWORD data_size = static_cast<DWORD>(lstrlenW(data) 1);
// ReSharper disable once CppCStyleCast
const auto l_set_status = RegSetValueExW(h_key, L"PATH", 0, REG_EXPAND_SZ, (LPBYTE)data, data_size);
RegCloseKey(h_key);
if (l_set_status == ERROR_SUCCESS)
{
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, reinterpret_cast<LPARAM>("Environment"), SMTO_BLOCK, 100, nullptr);
return true;
}
}
return false;
}
換句話說,我想在 C# 中找到以下內容的等價物:
var assemblyPath = Directory.GetParent(Assembly.GetEntryAssembly()!.Location).FullName;
var pathVariable = Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Machine);
Environment.SetEnvironmentVariable("PATH", $"{pathVariable};{assemblyPath}", EnvironmentVariableTarget.Machine);
編輯:我實際上沒有測驗該代碼是否擴展了值,但我想按照 C# 代碼的狀態進行操作,如果可能的話,不要擴展路徑變數中的變數。
uj5u.com熱心網友回復:
您正在嘗試更改注冊表中的 PATH 設定。因此,人們會期望您會從注冊表中獲取當前的 PATH 設定,對其進行更改,然后在注冊表中設定新的 PATH 設定。
但是您沒有從注冊表中獲取 PATH 設定。您正在從環境中獲取 PATH 變數。這是為什么?環境由注冊表中的設定控制,但不是該設定。特別是,您注意到在注冊表中設定的環境變數在它們實際進入環境之前會被擴展。
就像換壁紙一樣,把桌面截圖,換了截圖,然后設定為壁紙,然后問怎么去掉壁紙上的圖示。
解決方案是簡單地從注冊表中獲取當前未擴展的 PATH 設定,而不是從環境中獲取擴展的設定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/468954.html
