1

Installscriptプロジェクトでは、環境変数の値を登録するために再起動する必要があります。しかし、アプリケーションを再起動せずにセットアップする必要があります。では、環境変数の値を更新して、アプリケーションが登録され、再起動が不要になるようにする方法はありますか?私はすでに次のコード行を使用しています:

define WM_WININICHANGE 0x001A'
define HWND_BROADCAST 0xffff'
szEnv = "Environment";
pEnv = &szEnv;
SendMessage( HWND_BROADCAST, WM_WININICHANGE, 0, pEnv );`

環境変数値を更新する他の方法はありますか?私はこれをWindowsXPで実行しています。

4

2 に答える 2

0

ブロードキャスト アドレスに 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 関数はありません。そのため、これを外部関数としてプロトタイプ化し、それを呼び出す必要があります。

サンプルに関する議論は、ここで見つけることができます。

于 2011-10-20T13:16:04.673 に答える
0

環境変数を設定する Windows プロセスは、読み取りのためにその変数にアクセスできません。これは Windows の制限です。アイデアは、プロセスが変数を設定する場合、変数の値を既に認識しているということです。

したがって、インストーラーが環境変数を設定している場合、アプリケーションはその変数を読み取るために、別の無関係なプロセスで実行する必要があります。これが、インストールが完了したときにアプリケーションを起動できない理由です。

解決策は、インストール中にアプリケーションを起動するときに、アプリケーション コマンド ラインを介して変数値を渡すことです。今後の起動では、引き続き変数に直接アクセスします。

于 2011-10-20T12:42:16.057 に答える