- 締切済み
Shell関数の終了を調べる方法
Shell()関数を使ってほかのアプリケーションを起動し、終了を待つというよくある件なのですが、 ちょっと古くて、VB4.0の16ビット版による開発で、 動作環境はWindosXP(32ビット)です。 下記のように記述していますが、Shellの戻り値が&HFFFFを超えるためか、うまくいかないときがあります。 Private Declare Function GetModuleUsage Lib "Kernel" _ (ByVal hModule As Integer) As Integer Private Sub Command1_Click() Dim hInst As Integer hInst = Shell("calc.exe", vbNormalFocus) While GetModuleUsage(hInst) <> 0 DoEvents Wend MsgBox " 終了しました ", vbInformation End Sub ただしWindows98でも動作する必要があるので、32ビットにしてしまうというのはなしです。 どのようにしたらうまくいくのでしょうか? アドバイスください。お願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- kakusuke
- ベストアンサー率36% (95/259)
こんなサイトを見つけました。 これじゃだめですかね? Win32APIっていうぐらいだからなぁ・・・。
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
>速度がかなり遅くなるとかいうようなことはないでしょうか? 可能性はあります。 しかし、ループでまわして判断する方法も、メモリを消費すると思います。 影響度は、環境がないため検証ができません。 それと#2さんへの補足欄に書いてあるOSの見分け方法ですが、 http://www.bcap.co.jp/hanafusa/VBHLP/Version.htm でOSのバージョンを取得する方法があります。 私の自宅では、16bitのOS環境は倉庫に眠っておりますので、これまた未検証のまま無責任にURLを張っております。 とにかく、私には環境が無いので 「たぶん」「おそらく」 でしか言えません。 すいません。。。
- kakusuke
- ベストアンサー率36% (95/259)
GetExitCodeProcess だそうです。 GetModuleUsage は16ビットだそうです。
補足
ありがとうございます。 それはわかっているのですが、16ビット環境なのか32ビットなのかを判別して、これらを切り替えて使うということなどできるのでしょうか? もし可能なら、簡単なコーディングを教えていただけませんか?
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
シェルオブジェクトで実行するとかではダメ? Call CreateObject("WSCript.Shell").Run("calc.exe", , True) MsgBox " 終了しました ", vbInformation
お礼
ありがとうございます。 98でもXPでも動作しました。 ところでこのWSCriptを使った場合、普通にShell関数を実行するのに比べて、リソースの消費がとても大きくなるとか、速度がかなり遅くなるとかいうようなことはないでしょうか? もしご存知でしたら教えてください。 WSCriptというのは初めてなもので・・・ どうぞよろしくお願いいたします。
お礼
前回教えていただいたWScriptの方法は、 VBSファイルをテキストで作成して直接実行する方法は98でもうまくいったのですが、 VBからCreateObjectでCallすると、32ビット版ではできて16ビット版ではダメでした。 今度こちらの方法を試してみたいと思います。 ご親切なアドバイスありがとうございます。