tools
読み取り中…
検索中…
一致する文字列を見つけられません
env.h
[詳解]
1#pragma once
2#include <string>
3#include <cstdlib>
4#include <yy981/string.h>
5
6#ifdef _WIN32 // Windows
7 #include <windows.h>
8#else // UNIX系
9 #include <unistd.h>
10#endif
11
12/**
13 * @file env.h
14 * @brief 環境変数取得・設定ユーティリティ
15 *
16 * クロスプラットフォーム(Windows / UNIX 系)で環境変数を取得・設定する関数を提供します。
17 * Windows ではレジストリへの恒久的な書き込みにも対応しています。
18 */
19
20/**
21 * @brief 環境変数の値を取得する(簡易版)
22 * @param target 取得する環境変数名(例: "PATH")
23 * @param slash true の場合、バックスラッシュをスラッシュに変換する(デフォルト: true)
24 * @return 環境変数の値文字列。slash=true の場合は \ を / に置換済み
25 */
26inline std::string getEnv(const std::string& target, const bool slash = true) {
27 std::string result = std::getenv(target.c_str());
28 if (!slash) return result;
29 return st::replace(result,"\\","/");
30}
31
32/* 機能しない
33std::string getEnv(const std::string& target, const std::string& add = "") {
34 const char* result_raw = std::getenv(target.c_str());
35 if (!result_raw) return std::string();
36 const std::string result{result_raw};
37 bool s(add.contains("/")), bs(add.contains("\\"));
38 if ((!s&&!bs) || (s&&bs) || s) return st::replace(result,"\\","/") + add;
39 else if (bs) return st::replace(result,"/","\\") + add;
40 else throw std::runtime_error("getEnv(): スラッシュ-バックスラッシュ 判定エラー");
41}
42
43std::string getEnv(const std::string& target, const bool backSlash) {
44 std::string result;
45 if (backSlash) result = getEnv(target,"\\");
46 else result = getEnv(target,"/");
47 return result.substr(0, result.size()-1);
48}
49*/
50
51/**
52 * @brief 環境変数をプロセス内で設定する(現在のプロセスのみ有効)
53 * @param name 設定する環境変数名
54 * @param value 設定する値
55 * @param overrideExist 既存の変数を上書きするか(現在の実装では常に上書き)
56 * @return 設定に成功した場合 true、失敗した場合 false
57 */
58inline bool setEnv(const char* name, const char* value, bool overrideExist = true) {
59#ifdef _WIN32
60 if (_putenv_s(name, value)) return false; else return true;
61#else
62 // UNIX系での設定
63 if (setenv(name, value, 1)) return false; else return true;
64#endif
65}
66
67/**
68 * @brief 環境変数を Windows レジストリ (HKCU\\Environment) に恒久的に設定する
69 * @param varName 設定する環境変数名
70 * @param varValue 設定する値
71 * @return 設定に成功した場合 true、失敗した場合 false
72 * @note Windows 専用。設定後に WM_SETTINGCHANGE を送信し他のアプリに変更を通知します。
73 * @warning UNIX 系では常に false を返し、コンパイル警告が発生します。
74 */
75inline bool setEnvEx(const std::string& varName, const std::string& varValue) {
76#ifdef _WIN32
77 HKEY hKey;
78 LONG result = RegOpenKeyExA(HKEY_CURRENT_USER, "Environment", 0, KEY_SET_VALUE, &hKey);
79 if (result != ERROR_SUCCESS) {
80 // std::cerr << "レジストリキーを開けませんでした\n";
81 return false;
82 }
83
84 result = RegSetValueExA(hKey, varName.c_str(), 0, REG_SZ, (const BYTE*)varValue.c_str(), varValue.size() + 1);
85 RegCloseKey(hKey);
86
87 if (result != ERROR_SUCCESS) {
88 // std::cerr << "環境変数の設定に失敗しました\n";
89 return false;
90 }
91
92 // 変更を即座に反映させる
93 SendMessageTimeoutA(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_ABORTIFHUNG, 5000, nullptr);
94
95 return true;
96#else
97 #warning
98 return false;
99#endif
100}
bool setEnvEx(const std::string &varName, const std::string &varValue)
環境変数を Windows レジストリ (HKCU\Environment) に恒久的に設定する
Definition env.h:75
std::string getEnv(const std::string &target, const bool slash=true)
環境変数の値を取得する(簡易版)
Definition env.h:26
bool setEnv(const char *name, const char *value, bool overrideExist=true)
環境変数をプロセス内で設定する(現在のプロセスのみ有効)
Definition env.h:58
std::string replace(std::string str, const std::string from, const std::string to)
文字列中のすべての from を to に置換した新しい文字列を返す(値返し版)
Definition string.h:76
文字列操作ユーティリティ