Discussion:
(MSI) インストーラ内からコマンド実行
(too old to reply)
sunfish
2004-10-20 10:29:06 UTC
Permalink
hrsnです。度々お世話になります。

インストーラ内からカスタムアクションを使用してファイルを実行したいと思います。
カスタムアクションを使用して実行したところ、インストール中にコマンドプロンプト
の画面が一瞬表示されてしまい、あまりいい気がしません。

カスタムアクションからコマンドを実行するのに、コマンドプロンプトを表示させない
方法をご存知の方いらっしゃいましたらご教授願います。

ちなみに、VBScript からシェルを呼び出してオプション"0"をつけて実行する
というのはナシでお願いします。
とっちゃん
2004-10-22 02:01:07 UTC
Permalink
とっちゃんです。
Post by sunfish
インストーラ内からカスタムアクションを使用してファイルを実行したいと思います。
カスタムアクションを使用して実行したところ、インストール中にコマンドプロンプト
の画面が一瞬表示されてしまい、あまりいい気がしません。
カスタムアクションからコマンドを実行するのに、コマンドプロンプトを表示させない
方法をご存知の方いらっしゃいましたらご教授願います。
Copy とかの内部コマンドもしくは、XCOPY などのコンソールEXE(外部コマンド)の
実行でしょうか?
もしくは、自前のEXEだが、コンソールアプリということでしょうか?

WindowsInstaller のEXE実行カスタムアクションには引数は渡せますが
それ以外の情報は渡せません(引数ではコンソールの制御はできません)。

そのため、コンソールアプリは必ずコンソールが表示されてしまうことになります。
(インストーラによってはコンソールを表示しているものもあります)。
Post by sunfish
ちなみに、VBScript からシェルを呼び出してオプション"0"をつけて実行する
というのはナシでお願いします。
まさにこれが回避手段なのですが、上記以外の方法ということで

・実行したいコマンドと同じ機能を持つGUI形式のEXEを作成し、それを呼び出す。
・ラッパーのDLLまたはEXEを用意して(EXEの場合はGUI形式)
そこから CreateProcess で実際のコマンドを非表示で呼び出す。

後者はVBScript と同じことをDLLやEXEで実現するというだけです。
sunfish
2004-10-25 07:55:02 UTC
Permalink
hrsnです。
Post by とっちゃん
Copy とかの内部コマンドもしくは、XCOPY などのコンソールEXE(外部コマンド)の
実行でしょうか?
もしくは、自前のEXEだが、コンソールアプリということでしょうか?
後者です。
Post by とっちゃん
そのため、コンソールアプリは必ずコンソールが表示されてしまうことになります。
ありゃあ。やっぱりそうですか。
Post by とっちゃん
・実行したいコマンドと同じ機能を持つGUI形式のEXEを作成し、それを呼び出す。
・ラッパーのDLLまたはEXEを用意して(EXEの場合はGUI形式)
そこから CreateProcess で実際のコマンドを非表示で呼び出す。
後者はVBScript と同じことをDLLやEXEで実現するというだけです。
なるほど。
ということは、あれですか、VBScriptを使うにしても上記の方法をとるにしても
EXEはいったんインストールしないと実装不可ということですかね。

うーん。不要なファイルをなるべくインストールせずに済まそうと思ったのですが...
今回は不本意ながらVBScriptでいくとします。

とっちゃんさんの方法も覚えておきます。毎度ありがとうございます。
とっちゃん
2004-10-25 09:39:15 UTC
Permalink
とっちゃんです。
Post by sunfish
Post by とっちゃん
もしくは、自前のEXEだが、コンソールアプリということでしょうか?
後者です。
Post by とっちゃん
そのため、コンソールアプリは必ずコンソールが表示されてしまうことになります。
ありゃあ。やっぱりそうですか。
Post by とっちゃん
・実行したいコマンドと同じ機能を持つGUI形式のEXEを作成し、それを呼び出す。
・ラッパーのDLLまたはEXEを用意して(EXEの場合はGUI形式)
そこから CreateProcess で実際のコマンドを非表示で呼び出す。
後者はVBScript と同じことをDLLやEXEで実現するというだけです。
なるほど。
ということは、あれですか、VBScriptを使うにしても上記の方法をとるにしても
EXEはいったんインストールしないと実装不可ということですかね。
自作モジュールであれば、GUI形式に作り直すことでインストールせずに
呼び出すことが可能(なはず)です。

また、ラップする場合でも、自分でバイナリテーブルから展開してEXEを実行
とすれば、インストールしないでも利用が可能です。

ただし、どちらの場合でも、処理終了後に展開された一時ファイルを削除する
必要があるので、必ず終了待ちする必要があります。

開発コストと天秤にかける必要がありますね(^^;

一応、選択肢を書いておきます。

新規追加分
・GUIアプリとして作り直す。
この場合は、設定などが面倒ですので、一度GUIアプリのプロジェクトを起こし、
元のコンソールから、main関数以外を全部持ってきて、main関数のみ
WinMain の形式に変更します。

・ラッパーを用意する。
あらかじめインストールしたくない場合は、ラッパーの中から自分で
バイナリテーブル(別テーブルでも良いですが、ここが一番ローコスト)から
テンポラリに展開し、そのEXEを直接呼び出します。
ただし、この場合は、EXEの終了を待ち、終了したら展開したバイナリファイルを
自分で削除する必要があります(インストーラのあずかり知らぬ動作のため)。

--終了待ち動作について--
EXEを呼び出す場合は、常に動作が非同期になるため、終了待ちをしない場合は、
インストールするか、ソースメディア上に事前配置するか(インストーラパッケージと
一緒に配布)のどちらかしか選択肢がありません。
これは、原則的にはラッパーを使っていてもいなくても一緒です。

インストールしない&&終了待ちしないという条件を成立させるためには
ソースメディア上に配置するしか選択肢がないため、.msi と一緒に(同じフォルダか
またはサブフォルダに)配布する必要があります。
ただし、この場合は、インストール中にメディアが交換されない(CD配布など)という
条件が必要になります。

配布条件が面倒になるので、終了を待ちたくない場合は、インストールしてしまうほうが
手間が軽減できると思います(ファイルの存在チェックなども不要なため)。
Loading...