【问题标题】:How can I change an environment variable and have other apps see the value without logging out?如何更改环境变量并让其他应用程序在不注销的情况下看到该值?
【发布时间】:2016-10-02 06:54:54
【问题描述】:

我在 Windows7 64 位机器上使用 Delphi 10 Seattle。

问题来了:

为了给我的软件创建一个测试环境,我创建了一个小应用程序,将环境变量添加到 Windows 注册表中

HKEY_CURRENT_USER\Environment

我在我的包和主项目的搜索路径中使用这些变量,以便能够将项目设置提交到源代码控制并轻松地从生产分支切换到测试分支等......

现在的问题是,在创建环境变量后,Delphi 并没有更新其“内部系统变量存储”下

Tools --> Options --> Environment Variables

项目无法编译。

即使重新启动 Delphi 也没有带来预期的效果。 我必须完全重新启动 Windows,才能使其正常工作。

有没有办法在我的应用程序中更新 Delphi 中的系统变量? 我还缺少其他东西吗?

非常感谢!

【问题讨论】:

  • 出于好奇,尝试杀死并重新启动 explorer.exe - 也许重新启动 shell 会强制刷新。
  • 您应该阅读环境变量的文档,它会告诉您如何执行此操作。感觉好像您正在尝试对此进行逆向工程。你找过文档吗?
  • 谢谢大家。老实说,搜索 delphi embarcadero 文档是相当乏味的。我总是最终使用 google 或直接访问 stackoverflow.com。在这种情况下,我找到了例如 SetEnvironmentVariable() 但这仅在运行时为正在运行的进程设置变量。我需要的是一个真正的系统变量,它在我创建后仍然存在。
  • 当您被带到 Stack Overflow 时,您是否阅读了答案?试试这个:stackoverflow.com/q/5898131/33732。请注意,解决方案是两步,而不仅仅是一步。 (通过在 Google 上搜索“windows 永久设置环境变量”找到。)

标签: delphi environment-variables delphi-10-seattle


【解决方案1】:

我在 this blog post 中描述的路径压缩器中做类似的事情。相关的方法是这个:

procedure TPathCompressor.NotifyChanges;
{ Sending a WM_SETTINGCHANGE message to all top level windows. Otherwise the new environment variables
  will only be visible after logoff/logon. }
begin
  {$IFDEF DEBUG}
  Exit;
  {$ENDIF}
  SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, NativeInt(PChar('Environment')), SMTO_ABORTIFHUNG, 5000, nil);
end;

【讨论】:

  • 这正是它应该做的事情:) 谢谢 Uwe,也感谢所有其他人。
猜你喜欢
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 2022-07-26
相关资源
最近更新 更多