SetEnvironmentVariable() 似乎没有设置可以通过 getenv() 检索的值
SetEnvironmentVariable() does not seem to set values that can be retrieved by getenv()
我有一个 EXE,它在启动时通过 Windows API 环境变量 (即:MAGICK_CODER_MODULE_PATH=xxx
)SetEnvironmentVariable()
.
当我在 Process Explorer(来自 SysInternals)中查看设置为我的 EXE 的环境变量列表时,我可以看到我之前设置的环境变量(MAGICK_CODER_MODULE_PATH
),所以此时一切看起来都很好.
然后我指示我的 EXE 通过 LoadLibrary()
加载一个 DLL。稍后当此 DLL 尝试通过 getenv("MAGICK_CODER_MODULE_PATH")
获取我的环境变量的值时,问题出现了:it returns NULL!这怎么可能?看起来 getenv()
忽略了我之前用 SetEnvironmentVariable()
.
设置的值
注:
- 当使用旧版本的 Visual Studio 编译 DLL 时,这似乎不会发生(可能与
vcruntime140.dll
/ msvcp140.dll
有关)。
- 如果我打开命令提示符,执行
@SET MAGICK_CODER_MODULE_PATH=xxx
,然后从此命令提示符启动我的 EXE,那么一切正常:DLL 通过 [=15 成功获取 MAGICK_CODER_MODULE_PATH
的值=].
您正在混合 APIs:Windows' SetEnvironmentVariable
绕过 C++ 运行时,因此存储在您的程序中的环境副本不会更新。稍后的 getenv
调用会查看此副本,但没有找到您的更改。
两次调用使用相同的 API 级别。 getenv
and _putenv
, or use the Windows API GetEnvironmentVariable
and SetEnvironmentVariable
.
我有一个 EXE,它在启动时通过 Windows API 环境变量 (即:MAGICK_CODER_MODULE_PATH=xxx
)SetEnvironmentVariable()
.
当我在 Process Explorer(来自 SysInternals)中查看设置为我的 EXE 的环境变量列表时,我可以看到我之前设置的环境变量(MAGICK_CODER_MODULE_PATH
),所以此时一切看起来都很好.
然后我指示我的 EXE 通过 LoadLibrary()
加载一个 DLL。稍后当此 DLL 尝试通过 getenv("MAGICK_CODER_MODULE_PATH")
获取我的环境变量的值时,问题出现了:it returns NULL!这怎么可能?看起来 getenv()
忽略了我之前用 SetEnvironmentVariable()
.
注:
- 当使用旧版本的 Visual Studio 编译 DLL 时,这似乎不会发生(可能与
vcruntime140.dll
/msvcp140.dll
有关)。 - 如果我打开命令提示符,执行
@SET MAGICK_CODER_MODULE_PATH=xxx
,然后从此命令提示符启动我的 EXE,那么一切正常:DLL 通过 [=15 成功获取MAGICK_CODER_MODULE_PATH
的值=].
您正在混合 APIs:Windows' SetEnvironmentVariable
绕过 C++ 运行时,因此存储在您的程序中的环境副本不会更新。稍后的 getenv
调用会查看此副本,但没有找到您的更改。
两次调用使用相同的 API 级别。 getenv
and _putenv
, or use the Windows API GetEnvironmentVariable
and SetEnvironmentVariable
.