• 締切済み

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ビットにしてしまうというのはなしです。 どのようにしたらうまくいくのでしょうか? アドバイスください。お願いします。

みんなの回答

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.4

こんなサイトを見つけました。 これじゃだめですかね? Win32APIっていうぐらいだからなぁ・・・。

参考URL:
http://www.kit.co.jp/vbit/,http://www.kit.co.jp/vbit/QAndA02.htm
回答No.3

>速度がかなり遅くなるとかいうようなことはないでしょうか? 可能性はあります。 しかし、ループでまわして判断する方法も、メモリを消費すると思います。 影響度は、環境がないため検証ができません。 それと#2さんへの補足欄に書いてあるOSの見分け方法ですが、 http://www.bcap.co.jp/hanafusa/VBHLP/Version.htm でOSのバージョンを取得する方法があります。 私の自宅では、16bitのOS環境は倉庫に眠っておりますので、これまた未検証のまま無責任にURLを張っております。 とにかく、私には環境が無いので 「たぶん」「おそらく」 でしか言えません。 すいません。。。

yy2000
質問者

お礼

前回教えていただいたWScriptの方法は、 VBSファイルをテキストで作成して直接実行する方法は98でもうまくいったのですが、 VBからCreateObjectでCallすると、32ビット版ではできて16ビット版ではダメでした。 今度こちらの方法を試してみたいと思います。 ご親切なアドバイスありがとうございます。

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.2

GetExitCodeProcess だそうです。 GetModuleUsage は16ビットだそうです。

参考URL:
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_getexitcodeprocess.htm
yy2000
質問者

補足

ありがとうございます。 それはわかっているのですが、16ビット環境なのか32ビットなのかを判別して、これらを切り替えて使うということなどできるのでしょうか? もし可能なら、簡単なコーディングを教えていただけませんか?

回答No.1

シェルオブジェクトで実行するとかではダメ? Call CreateObject("WSCript.Shell").Run("calc.exe", , True) MsgBox " 終了しました ", vbInformation

yy2000
質問者

お礼

ありがとうございます。 98でもXPでも動作しました。 ところでこのWSCriptを使った場合、普通にShell関数を実行するのに比べて、リソースの消費がとても大きくなるとか、速度がかなり遅くなるとかいうようなことはないでしょうか? もしご存知でしたら教えてください。 WSCriptというのは初めてなもので・・・ どうぞよろしくお願いいたします。

関連するQ&A

専門家に質問してみよう