プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (4件)

>速度がかなり遅くなるとかいうようなことはないでしょうか?


可能性はあります。
しかし、ループでまわして判断する方法も、メモリを消費すると思います。
影響度は、環境がないため検証ができません。




それと#2さんへの補足欄に書いてあるOSの見分け方法ですが、
http://www.bcap.co.jp/hanafusa/VBHLP/Version.htm
でOSのバージョンを取得する方法があります。

私の自宅では、16bitのOS環境は倉庫に眠っておりますので、これまた未検証のまま無責任にURLを張っております。


とにかく、私には環境が無いので
「たぶん」「おそらく」
でしか言えません。
すいません。。。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/04/15 22:18

こんなサイトを見つけました。



これじゃだめですかね?
Win32APIっていうぐらいだからなぁ・・・。

参考URL:http://www.kit.co.jp/vbit/,http://www.kit.co.jp/ …
    • good
    • 0

GetExitCodeProcess


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

参考URL:http://www.microsoft.com/japan/developer/library …

この回答への補足

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

補足日時:2006/04/11 21:42
    • good
    • 0

シェルオブジェクトで実行するとかではダメ?


Call CreateObject("WSCript.Shell").Run("calc.exe", , True)
MsgBox " 終了しました ", vbInformation
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/04/11 21:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!