@IT会議室 新規書き込み停止(2012年10月9日)のお知らせ

@ITの会員制度「@ITクラブ・メンバーシップ」(@ITクラブ)は、10月9日より、弊社が運営するメディアの共通会員制度である「アイティメディアID」へ移行することになりました。これに伴い、@ITクラブのサービスの一部を変更させていただきます。

@IT会議室については、2012年10月9日をもって新規書き込みを終了いたしました(閲覧は引き続き可能です)。今後、質問や回答などは「QA@IT」(http://qa.atmarkit.co.jp/)をご利用くださいますよう、お願い申し上げます。

実行ファイル(exe)が処理結果を戻り値として呼び出
し側に返す方法


未記入

2009-06-10 12:06

VB.NETで
* Windowsフォームアプリケーションで,作成した実行ファイル(exe)が処理結果を戻り値 として呼び出し側に返す方法をお教えください。
1.プロジェクトでModule を追加し,ここに処理を入れ,Form1を開かずに,Ret値を返し実行を終了する。
2.呼出側は,VBScript です。

Module Module1
Function Main()
Dim ret as integer
''処理:外部PCからTCP/IP経由で,データを受信するサーバーアプ :
ret = 受信データ(integer)

''Form1は開かずに処理終了
''frmForm.ShowDialog()

Return ret ← このコードを呼出側に返したい
End Function
End Module

コメント

2009-06-10 13:11

Environment.ExitCode
でどうでしょうか?

2009-06-11 11:56

ひでたつさん 早々 ご回答有難うございました。
お手数ですが続けて以下の質問もよろしくお願い致します。
1.呼出側は,VBScript です。WshShell.Exec("***.exe ") を使用すると,
戻値は StdOut StdErr から得るようですが,リターンコードをそのまま
受取れないのでしょうか?
2.そうであれば,VB.NET側でリターンコードを .Exec が受取れるようにするには? コンソールアプリにすると Win窓が表示されてしまいますね...。
P.S
Environment.ExitCode x と Environment.Exit(x) の違いは
C と同じなのでしょうか? 以上 よろしくお願い致します。

2009-06-11 14:41

すみません、VBScript というのを見逃していました。
1.そうですね。受け取れないみたいです。
2.今、実際にやってみましたが、VB.NET 側で、Console.WriteLine("戻り値")
  とすると標準出力に出力されて、VBScript 側の オブジェクト.StdOut.Read
  で読み込む事が出来ました。お試し下さい。

ExitCode は、とりあえず、戻り値をセットしておくだけ。
Exit は、戻り値をセットしてプロセスは即終了する。
ような感じでしょうか。

ちなみに、コンソール でも FreeConsole() の API を使えば非表示にできます。

2009-06-11 15:13

こんにちは。

1.呼出側は,VBScript です。WshShell.Exec("***.exe ") を使用すると,
戻値は StdOut StdErr から得るようですが,リターンコードをそのまま
受取れないのでしょうか?

ExitCodeは、標準出力(StdOut)標準エラー出力(StdErr)では取得できません。

呼出側(VBScript)では、
呼び出したプログラムの終了を待って、(Status プロパティ
ExitCodeの値を取得します。(ExitCode プロパティ

具体的なコードはここが参考になりそうです。
http://www.whitire.com/vbs/tips0108.html


2.そうであれば,VB.NET側でリターンコードを .Exec が受取れるようにするには? コンソールアプリにすると Win窓が表示されてしまいますね...。

Win窓?Dos窓でしょうか?
ExitCodeは、コンソールアプリケーションでなくても、Windowsアプリケーションに対しても受け取れます。

2009-06-11 16:17

あ、VBScript でも ExitCode を取得できるんですね。
失礼しました。

Tdnr_Sym さん、ありがとうございます。

2009-06-12 11:06

ひでたつさん Tdnr_Sym さん 早々 ご回答有難うございました。
1.WshExec.ExitCode を使用して,うまく受取れました。ありがとうございました。 下記コード ①~③いずれもOkでした。
2. .Exec ではコンソール表示さるのでWindアプリにして,フォームを表示せずリターン値を 返して実行終了としました。これって問題ないですよね。
フォーム表示がないので,タイムアウトとか…。
外部実行プログラムがサーバで他のPCからのTCP/IP受信待ちで長時間待ちになる こともあります。
ひでたつさんのFreeConsole()は,呼出側での使用になるのでは?。
VB.NETコンソールアプリのなかで非表示可能でしょうか?

.Run を使ってファイル渡しは,これで避けられました。
ひでたつさん Tdnr_Sym さん ありがとうございました。

●呼ぶ側(VBScript)--------------------------------------
Set WshShell = CreateObject("WScript.Shell")
''外部プログラム実行
Set WshExec = WshShell.Exec("D:\Usr\Test\K_Server.exe")
Do While WshExec.Status = 0
'実行終了ウエイト
WScript.Sleep 100
Loop
''for デバッグ
WScript.Echo "終了ステータス ExitCode:" & WshExec.ExitCode ←●
WScript.Echo "終了ステータス Status:" & WshExec.Status

●呼ばれる側(VB.NET Windアプリ)
Module Module1
Function Main() As Integer
:
''フォームは開かない
''frmForm.ShowDialog()
''画面切替え信号リターン ①~③いずれもOk
''Return rt '' or ・・・・・①
''Environment.ExitCode = rt ・・・・・②
Environment.Exit(rt) ・・・・・③
End Function
End Module

2009-06-12 13:46

そうですか、よかったです。

本来であれば、呼び出し側で AllocConsole/FreeConsole して使うものですが、
呼ばれた側で FreeConsole しても(一応)非表示にはなります。
もしかして、間違った使い方かもしれませんけど…。

フォーム表示がないので,タイムアウトとか…。

多分、問題ないと思います。

2009-06-17 09:58

VB.NETで
ひでたつさん ご回答有難うございました。
日をおいてしまいました。申し訳ありません。
FreeConsole の件で再度お願い致します。

下記のVB.NETコンソールアプリで FreeConsole() で非表示にならない
のですが使用方法が間違ってますか?

<VB.NET コンソールアプリ Vstudio 2008>
Module Module1
Declare Function FreeConsole Lib "kernel32.dll" () As Integer
Function Main() As Integer
FreeConsole() ← ●

Environment.Exit(rt)
End Function
End Module

2009-06-17 12:58

提示されたコードで試してみました。
起動時に一瞬表示されますが、
FreeConsole() が呼ばれた時点で非表示になりました。

2009-06-19 10:32

ひでたつ さん 有難うございます。
おっしゃるとおり,一瞬表示されて消えます。
この一瞬が消えないようなのでWinアプリでいこうかと思います。
これで本件は,おかげさまで解決いたしました。収束とさせていただきます。
プログラムまで試していただきありがとうございました。
ご教示いただいた,ひでたつさん Tdnr Sym さんありがとうございました。
感謝