更改环境值后的 Innosetup SendMessage

bar*_*ris 5 winapi casting inno-setup

我使用 InnoSetup 在注册表中设置环境变量:

[Registry]
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; ValueName: "MY_PROGRAM_HOME_DIR"; ValueData: "{app}"
Run Code Online (Sandbox Code Playgroud)

但是系统无法看到这个变量,直到我调用SendMessage.

[Code]
procedure DeinitializeSetup();
begin
  // HWND_BROADCAST = $FFFF 
  // WM_SETTINGCHANGE = $001A
  SendMessage($FFFF, $001A, 0, Longint(PChar('Environment')));
end;
Run Code Online (Sandbox Code Playgroud)

InnoSetup 说:

... 第 60 列:类型不匹配

我该如何正确的类型转换PCharLongint在InnoSetup脚本?

TLa*_*ama 6

使用ChangesEnvironment指令而不是从脚本代码中执行相同操作。从参考:

当设置为 yes 时,安装程​​序会在安装结束时通知其他正在运行的应用程序(特别是 Windows 资源管理器),它们应该从注册表重新加载它们的环境变量。

在 InnoSetup 中,当你使用上面的指令时,里面会调用下面的代码:

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
  LPARAM(PChar('Environment')), SMTO_ABORTIFHUNG, 5000, MsgResult);
Run Code Online (Sandbox Code Playgroud)