如何从 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##.dllucrtbase.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?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Delphi 调用 Oracle 函数?

如何在 Delphi 中调试从 Java 调用的 DLL?

DELPHI调用DLL时的回调函数问题

请问在Delphi里如何从一个窗体调用另一个窗体?

如何从 Delphi 中的 PsafeArray 打印信息?

delphi 调用 c语言 dll