3

我有一个使用getenv( <stdlib.h>) 调用获取启动选项的 DLL。我想在打开 DLL 之前在同一进程中设置该变量,以便可以通过getenv. 我应该使用哪个功能来设置它?

我了解到windows下有两组环境变量:一组通过win32 API(GetEnvironemntVariable,SetEnvironmentVariable)操作,另一组可以使用读取getenv,并且可能通过_putenv设置,是我应该使用的吗?

这个函数是否可以从 python 访问,也许是通过 ctypes?

4

2 回答 2

2

目前~VS2019的情况似乎是:

  • getenv函数的调用从 MS CRT 在加载时初始化的块中检索值。
  • 调用以GetEnvironmentVariable从流程环境块中检索值。
  • 调用SetEnvironmentVariable更新来自进程环境块的值。这些变化不会被.getenv
  • 调用putenv更新CRT 块中的值,调用Win32SetEnvironmentVariable更新进程环境块

所以,实际上不管你用它做什么:

  • 用于_wputenv_s设置环境变量 - 它会同时更新两者。
  • 用于::GetEnvironmentVariableW读取:它将从环境块中读取,无论使用哪种方法,都将包含该值。

关于getenv

如果使用的代码使用getenv与您的代码相同的 MS CRT - 也就是说,代码动态链接到 CRT 并且实际上使用与您相同的版本,那么您始终可以使用putenv.

如果 DLL(及其 CRT)是动态加载或延迟加载的,并且您能够putenv在加载 dll 之前调用,那么您可以使用它。

(这是推测,我还没有完全测试过:)如果 DLL 已经加载到您的进程中并且它使用静态链接的 CRT,或者您使用的 CRT 之外的另一个 CRT,则 getenv调用的环境数据已经加载向上,您在 DLL 边界一侧所做的任何事情都不会改变这一点。我猜在这种情况下运气不好。

参考:

于 2022-02-04T09:37:59.567 回答
1

由于问题是用 Python 标记的,因此在 Python 中管理环境变量的好方法是更新os.environ映射。

因为文档os.putenv()说:

对 os.environ 中项目的赋值会自动转换为对 putenv() 的相应调用;但是,对 putenv() 的调用不会更新 os.environ,因此实际上最好分配给 os.environ 的项目。

于 2022-02-04T10:08:45.853 回答