如何从 Delphi 调用 _putenv?
Posted
技术标签:
【中文标题】如何从 Delphi 调用 _putenv?【英文标题】:How to call _putenv from Delphi? 【发布时间】:2021-09-15 21:23:47 【问题描述】:有没有一种(简单的)方法可以从我的 Delphi 应用程序中调用 _putenv()
?
这是SetEnvironmentVariable() does not seem to set values that can be retrieved by getenv()的后续。
【问题讨论】:
这些函数似乎是 Microsoft C 运行时库的一部分,而不是 Windows 的一部分。 你确定你不想要SetEnvironmentVariable()
?
@AmigoJack 是的,我需要 _putenv,因为这个:***.com/questions/69199708/…
@AndreasRejbrand 是的,它看起来像一个 Microsoft C 运行时,但我怎样才能从 delphi 中正确调用它?
@zeus Delphi 不是 C。除非您链接到使用 C 运行时的外部库,否则您的 Delphi 应用程序中将不存在 C 运行时。为什么你认为你需要在 Delphi 代码中调用 C 函数?您要解决的真正问题是什么?
【参考方案1】:
根据您的earlier question,您的 Delphi EXE 正在加载一个用 C++ 编写的 DLL。因此,请检查您的 EXE 进程是否正在通过相关的 C++ DLL 将 msvcrt##.dll
或 ucrtbase.dll
运行时 DLL 加载到其中。如果是这样,那么EXE可以通过GetModuleHandle()
找到运行时DLL的HMODULE
句柄,然后通过GetProcAddress()
检索指向_putenv/_s()
的指针,然后调用它。
【讨论】:
你是最好的就是这样,一个空白的delphi应用程序在启动msvcrt.dll时加载(不知道为什么,但它是这样的)并缓存环境变量,所以当后来我调用了setEnvironementVariable,然后用msvcrt.dll加载了一个dll,并尝试从这个dll调用getenv,然后它使用了msvcrt.dll的缓存,看不到我之前通过setEnvironementVariable所做的改变,真可惜:( 我现在将尝试从 msvcrt.dll 导入 _putenv 并使用它而不是 setEnvironementVariable。不明白为什么存在如此丑陋的 getenv :( 我之前为_errno: function: PInteger; cdecl;
这样做的原因类似:它的工作原理与任何其他导入一样,然后我能够检查这些 DLL 中先前调用的失败。以上是关于如何从 Delphi 调用 _putenv?的主要内容,如果未能解决你的问题,请参考以下文章