3

製品のインストールにはInstallShield 2008を使用しています。製品はいくつかのコンポーネントで構成されています。コンポーネントがインストールされると、このコンポーネントに固有のポスト インストール ルーチンを含むバッチ ファイルが実行されます。

問題: インストール後のバッチ ファイルは、 InstallScriptを介して製品のインストール中に設定されるいくつかの環境変数を使用します。しかし、バッチファイルは、レジストリ (および新しく作成された環境変数) の変更をすぐに確認できないようです。

システムを再起動せずにインストールを完了する方法はありますか?

潜在的に役立つ情報: ターゲット システム - Windows XP、現在ログインしているユーザーは管理者グループに属しています。

4

2 に答える 2

4

以前のバージョンの InstallShield でも同じ問題がありました。これが私が解決した方法です(迅速で汚いコード)。

#define HWND_BROADCAST          0xffff
#define WM_SETTINGCHANGE        0x001A
function UpdateEnvironmentVariable(szKey, szValue)
  NUMBER nResult;
  STRING szEnv;
  POINTER pEnv;
begin
  nResult = RegDBSetKeyValueEx(szKey, "PATH", REGDB_STRING, szValue, -1);

  szEnv = "Environment";                    
  pEnv = &szEnv;                  
  SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, pEnv );
end;

重要なのは、SendMessage を使用することです。それが役に立てば幸い。

于 2010-01-20T18:39:43.520 に答える
1

InstallShield 2010 以降を使用している InstallShield ユーザー。

重要: InstallScript エンジンは、バージョン 2010 以降、Unicode 用に変更されました。

したがって、使用POINTER pEnv;すると機能しなくなります。WPOINTER pEnv;代わりに使用する必要があります。私は個人的にInstallShield 2013を使用しており、見つかったものはすべて「アプローチ」を示唆していましPOINTERたが、これは後のバージョンに変換されないレガシー コードです。

InstallShield 2013 で次の InstallScript 関数を使用します。

// Flush the NT registry to all applications.
function RefreshEnvironment()
    STRING szEnv;
    WPOINTER pEnv;
begin     
    szEnv = "Environment";
    pEnv = &szEnv;
    SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, pEnv);
end;

そして私の定義のために私は使用します:

// defines
#define WM_SETTINGCHANGE 0x001A
#define HWND_BROADCAST 0xffff

したがって、ここで重要なのは、WM_SETTINGCHANGEをすべてのトップレベル ウィンドウにブロードキャストすることです。このようにして、システム全体の変更が行われたことを認識します。

于 2013-12-03T22:11:21.553 に答える