• ベストアンサー

VBについて教えてください。

1.a.exeでShell関数でb.exe起動したときにa.exeはみれなくして   b.exeで終了するとb.exeはなくなりa.exeだけにしたいのですが   どうすればよいのかおしえてください。   a.vbp   RetVal = Shell("c:\b.exe", 1)   ← b.exeの起動 b.vbp end ← 終了   b.exeが起動中はヤククにa.exeがなくなり、b.exeが終了すると   a.exeが起動するようにしたいのです   よろしくお願いします。   WINDOWS98でvb6.0で開発しています。   

質問者が選んだベストアンサー

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

こんにちは。maruru01です。 APIを使ってShell関数で呼び出したプログラムを終了するまで、元のプログラムが待機している関数を自作しました。 a.vbpのForm1にb.exeを呼び出すためのコマンドボタン"cmdOpen"があるとします。 では。 Private Sub cmdOpen_Click()   Dim FullPath As String  'b.exeのフルパス   Form1.Visible = False   FullPath = "c:\b.exe"   WaitShell FullPath   Form1.Visible = True End Sub 以下は標準モジュールに記述 Public Declare Function OpenProcess Lib "kernel32" _     (ByVal dwDesiredAccess As Long, _     ByVal bInheritHandle As Long, _     ByVal dwProcessId As Long) As Long '【機能】  : 既存のプロセスオブジェクトのハンドルを返す '【戻り値】 : (成功)指定したプロセスのオープンハンドル '      (失敗)NULL Public Const PROCESS_QUERY_INFORMATION = &H400& Public Declare Function GetExitCodeProcess Lib "kernel32" _     (ByVal hProcess As Long, _     lpExitCode As Long) As Long '【機能】  : 指定されたプロセスの終了状態を返す '【戻り値】 : (成功)0以外(終了していないときはSTILL_ACTIVEが格納される) '      (失敗)0 Public Const STATUS_PENDING = &H103& Public Const STILL_ACTIVE = STATUS_PENDING Public Declare Function CloseHandle Lib "kernel32" _     (ByVal hObject As Long) As Long '【機能】  : オープンしているオブジェクトハンドルをクローズする '【戻り値】 : (成功)0以外 '      (失敗)0 'アプリケーションを起動し、終了するまで待機する Public Sub WaitShell(AppPath As String, Optional SizeFocusmode As Integer = vbNormalFocus)   Dim AppID As Long 'Shell関数の戻り値   Dim Process As Long 'OpenProcess関数の戻り値   Dim ExitCode As Long '終了コード   Dim rc As Long   AppID = Shell(AppPath, SizeFocusmode)   Process = OpenProcess(PROCESS_QUERY_INFORMATION, 1, AppID)   'プロセスが終了していない間はDoEvents関数でOSに制御を戻す   Do     rc = GetExitCodeProcess(Process, ExitCode)     DoEvents   Loop While ExitCode = STILL_ACTIVE   rc = CloseHandle(Process) End Sub

その他の回答 (2)

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.2

単純解ですが、Shell関数でb.exeを起動後にEnd ステートメントを使ってa.exeを終了させ、 b.exe終了時にShell関数でa.exeを再び起動する、って風にしたらだめなのでしょうか。

  • ykymtkt
  • ベストアンサー率51% (14/27)
回答No.1

a.exeは、標準 EXE b.exeは、ActiveX EXE で作成しましょう。

関連するQ&A

  • VB6のWScript.Shellについて

    VB6のWScript.Shellで、他のVB6プログラムを起動する時の戻り値について教えてください。 AというVBプログラムからBというVBプログラムを起動するシステムがあります。 Bというプログラムで取得した値をAに返す方法はありますでしょうか? Aのソースは以下の通りです。 --------------------------------------------- sub test() dim objWshShell set objWshShell = Wscript.CreateObject("WScript.Shell") objWshShell.Run "C:\B.exe" & " " & hikisu1 & " " & hikisu2 , 1, wait End Function ---------------------------------------------- objWshShell.Runの戻り値はtrueまたはfalseのみのようです。 B.exeからtrue、false以外の値を取得する方法はありますか? また、やり方はobjWshShell.Runでなくてもよいです。 よろしくお願いします。

  • VB6のShell制御について

    VB6のShell制御について 以前http://okwave.jp/qa/q6069911.htmlで 質問させていただき、解決することができました。 取引先などのダイアログexeを何本か開発し、連結テストをした際に PM経由でテスター(エンドユーザー)から「ダイアログ起動中は、起動基のexeを 触らせないようにできないか」と 指摘があり、修正をしています。 Shellのパラメータ等を弄ったり、書籍やネットを調べてみましたが 指摘を満たすようなサンプルが見つかりませんでした。 納期も近く、どのようにすれば指摘点を満たせるか教えていただけないでしょうか? 開発環境 Windows XP PRO SP4 Visual Basic6.0(SP6)

  • VBで作成した実行形式の戻り値を作成したい

    VBで作成した実行形式の戻り値を作成したいと考えています. たとえば,A.exeという実行形式をVBで作成します. このA.exeを別のプロジェクトでshell関数などで起動します. 処理が終了した時に, A.exeの処理が成功した場合に1 A.exeの処理が失敗した場合には0を返すようにしたいと考えています. 可能でしょうか? 環境:Windows2000+SP3 Visual Basic 6.0+SP5

  • 【VB2005】別のプログラムから別のプログラム起動

    "A"というVB2005で、作成したプログラムがありまして、 メインのフォームがあり、 そこにボタンがあります。 Shellの関数を使って、クリックイベントで、 指定したExe"B"を立ち上げます。 そのExe"B"は、VB2005で作成したオリジナルのプログラムです。 プロジェクトは別で作った物と考えてください。 Exe"B"を起動した画面を[フォーム1]と考えて、 ボタンがあり、クリックすると 別の[フォーム2]が表示するはずなのですが、 特にエラーも掴まずに、Showで開くことができません。 しかし、Exe"B"からダイレクトに起動させて ボタンをクリックしたら[フォーム2]が表示されます。 どうしたら、Exe"A"からExe"B"を起動して Exe"B"からフォーム2を呼び出すことができるか、 考えられる要因などをアドヴァイスして頂けたら助かります。

  • VB6.0 Shellによる終了監視について

    VB6.0について困っております。 VB6.0にてファイル管理ソフトを開発しています。VBより他アプリ(MS OfficeやAutoCAD等)ファイルを起動させ、終了を監視(終了処理実行のため)しています。 具体的にはWshのshell.Runコマンドを使用して wsh.run("アプリ",NormalFocus,True)として起動させています。 ここで、複数ファイルを起動した場合、最後に起動したファイルが終了しないと、他の終了が検知できません。 例) ファイルAを起動 ファイルBを起動 ファイルCを起動 ファイルDを起動 ↓ ファイルAを終了 ←終了しても終了検知しない ファイルBを終了 ←終了しても終了検知しない ファイルCを終了 ←終了しても終了検知しない ファイルDを終了 ←終了するとA・B・C・Dの終了をまとめて検知し終了処理実行 これを、各ファイルごとに終了を検知させる方法はありませんでしょうか? よろしくお願い致します。

  • VB6.0(SP6)にて開発を行なっています。参照設定に関して教えてく

    VB6.0(SP6)にて開発を行なっています。参照設定に関して教えてください。 ソースコードはVSS(VisualSourceSafe)にて管理しています。 3つのフォルダにそれぞれVB6.0のプロジェクトがあります。 C:. +---フォルダ1 | ProjectA.dll ←このdllはVSS管理されていない。 | ProjectA.vbp | +---フォルダ2 | ProjectB.dll ←このdllはVSS管理されていない | ProjectB.vbp | \---フォルダ3 ProjectC.exe ←このexeはVSS管理されていない ProjectC.vbp 上図にはdllファイルもexeファイルも記載してありますが、dllファイルとexeファイルはVSSでは管理(登録)しておりません。各開発担当者はVSSから最新のソースコードを取得して、各自のローカル環境でビルドを行なってdllやexeを生成します。 ProjectA.vbpはProjectA.dllを生成します。 ProjectB.vbpはProjectB.dllを生成します。 ProjectC.vbpはProjectC.exeを生成します。 ここでProjectC.vbpはProjectA.dllとProjectB.dllを参照しています。 ここからが質問なのですが、A君の環境でProjectA.dllとProjectB.dllを生成したあとProjectC.vbpをビルドすると問題なくProjectC.exeが生成できます。ところが、B君の環境で同じことをやろうとすると、ProjectA.dllとProjectB.dllを生成まで問題なくできるもののProjectC.vbpをビルドしてProjectC.exeを生成する際に、ProjectA.dllとProjectB.dllが参照エラーとなってしまいます。参照設定をし直せばB君の環境でもProjectC.vbpをビルドしてProjectC.exeを生成できるようになります。ところが、参照設定し直したProjectC.vbpをVSSにチェックインして、A君の環境で最新ソースを取得してProjectC.vbpをビルドしようとすると今度はA君の環境でProjectA.dllとProjectB.dllが参照エラーとなってしまいます。 各開発担当者のローカル環境で参照設定をしなおさずに済むようなプロジェクトの設定方法がありましたら教えていただけないでしょうか。よろしくお願いします。 (なお、変更したのはProjectCの参照設定のみであり、ProjectAとProjectBには一切変更箇所はありません。)

  • VB6でWSH(vbs)を起動できる方法を教えてください。

    visual Basic 6でアプリケーションを開発していますが、 このアプリケーション(exe)から、test.vbsを起動したいと考えています。 ====vbのコード===== 'ボタンクリックしたら、test.vbsが実行される Private Sub Command1_Click() shell("test.vbs") End Sub ==== test.vbs ==== MsgBox("test.vbs起動しました。") です。 上記のようにコードを書きましたが、Shell関数で 「実行時エラー'5' プロシージャの呼び出し、または引数が不正です。」 のメッセージが出力されて、vbsが起動できません。 VB6でWSH(vbs)を起動できる方法を教えてください。 環境は以下の通りです。 OS:WIN2000 アプリ:VB6 ブラウザ:IE5.0

  • VB6.0から起動したexeファイルを終了するとエラーが発生して困っています

    VB6.0(OSはWindowsXP)中からShell関数を利用してexeファイルを起動したのですが、そのexeファイルを終了すると決まってアプリケーションエラーが発生します。これを直接かショートカットで実行して終了するとエラーは出ません。どなたか考えられる原因や解決策をご存じの方、教えて頂けませんでしょうか?よろしくお願い致します。

  • VBからExcelクローズ検知

    VBで作成したaaa.exeの中でエクセルファイルbbb.xls、ccc.xlsを呼び出しています。 taskIdB = Shell("C:\Program Files\Microsoft Office\Office10\excel.exe C:\bbb.xls", vbHide) taskIdC = Shell("C:\Program Files\Microsoft Office\Office10\excel.exe C:\ccc.xls", vbHide) bbb.xls、ccc.xlsともにWorkbook_Openイベントで自動的にVBAが起動し、処理が終了すると自分自身を クローズするようになっています。 ここで問題になるのが、ccc.xls は bbb.xlsの処理完了を待ってから起動したいのですが、連続的に起動してしまう点です。 aaa.exeのなかで、bbb.xlsの終了を検知するなど、良い解決方法があればお教え下さい。 WindowsはXp pro.、VBは6.0、Excelは2002を使用しています。 よろしくお願いいたします。

  • VB.NETでEXE呼び出し

    こんにちわ。 いまVB.NET2003で開発している者です。 あるEXEから別のEXEをある引数を与えてShellで起動しました。 ところが正常に動作しません。 ところが呼び出されたEXEを単体で起動し、 上記の引数をコマンドラインに設定して起動したところ、 正常に動作しました。 このようなことがあり得るのでしょうか? 何か原因がありましたら教えてください。 よろしくお願いします。

専門家に質問してみよう