ブロードキャスト アドレスに WININICHANGE メッセージを送信するのは正しいことです。ただし、実行中のすべてのプロセスがそのメッセージを正しくサブクラス化し、そのプロセスの環境変数を更新する必要はありません。彼らはそうするはずですが、常に起こるとは限りません。これの最も悪名高い例は、Service Control Manager です。新しい変数/値を表示するには、SCM を再起動する必要があります。
現在実行中のプロセスにこの値を表示するにはどうすればよいですか? (コスミンはそれがあなたの求めていることだと思っているようですが、あなたがそうであるかどうかはわかりません)その答えは、環境空間に4つのコレクションがあることを理解することにあります。
ユーザー マシン プロセス 揮発性
http://msdn.microsoft.com/en-us/library/6s7w15a0(v=vs.85).aspx
コードが行うことは、SYSTEM の環境変数を設定することです。これは、autoexec.bat ( SET FOO=BAR ) に行を入れて再起動する昔のようなものです。ただし、Windows から新しい dos プロンプトを作成し、SET SOMETHING=ELSE を実行することもできます。これは、そのプロセスと子プロセスの存続期間中のみ表示され、他のプロセスは表示されません。これは、「プロセス」スペースと「システム」スペースです。また、新しい変数で AUTEXEC.BAT を更新し、再起動せずに新しいプロセスを作成した場合、新しい変数は表示されませんが、いつでも自分で設定して表示できます (ただし、技術的には同じものではありません)。
SendMessage を使用すると、再起動は必要ありませんが、すべてのプロセスがメッセージを受け取るわけではありません。
そのため、現在の InstallScript プロセスにもこの新しい変数が必要な場合は、Kernel32 のSetEnvironmentVariable関数を呼び出す必要があります。この関数は、MSDN によると、「現在のプロセスの指定された環境変数の内容を設定します。」
興味深いことに、InstallScript には GetEnvVar 関数がありますが、SetEnvVar 関数はありません。そのため、これを外部関数としてプロトタイプ化し、それを呼び出す必要があります。
サンプルに関する議論は、ここで見つけることができます。