外部プログラムからの戻り値No.25444
mshishido さん 08/09/20 13:58
 
マクロコマンド runsync2 で外部プログラムを実行した場合について質問します。

質問:
外部プログラムからの戻り値をマクロプログラムから参照する方法を教えて下さい。

[ ]
RE:25444 外部プログラムからの戻り値No.25445
Iranoan さん 08/09/20 16:30
 
 mshishido さん今日は、Iranoan です。
 念の為お断りしておくと、開発者とは何の関わりも無い単なる一ユーザです。
> 外部プログラムからの戻り値をマクロプログラムから参照する方法を教えて下さい。
 「外部プログラムからの戻り値」とはなんでしょう?
・プログラムの実行に成功したかどうか?→result
・プログラムの標準入出力/エラー出力
  →run+リダイレクト (> con) を使う
  ただし実行に時間がかかる場合、終了まで待機するわけではないので、不都
  合がある

[ ]
RE:25445 外部プログラムからの戻り値No.25446
mshishido さん 08/09/20 17:09
 
Iranoanさん、はじめまして。

回答ありがとうございます。

> 「外部プログラムからの戻り値」とはなんでしょう?

例えば、次のような外部プログラムがあったとします。
int main( void )
{
 サイコロを振る;
 return( 出目 );
}

これの実行可能ファイル名が saikorog.exe だとした場合、秀丸マクロからこれを実
行するには、runsync2 saikoro.exeとやることになります。このとき、saikoro.exe
 の戻り値は、1,2,3,4,5,6のいずれかになります。この戻り値を秀丸マクロで参照
したいわけです。

ちなみに、WindowsのCMDコンソールスクリプトで saikoro.exe を実行した場合、プ
ログラムの戻り値は errorlevel という組み込みの環境変数で参照できるようです。

[ ]
RE:25446 外部プログラムからの戻り値No.25447
アルビレオ さん 08/09/20 18:13
 
ユーザ−のアルビレオです。

>これの実行可能ファイル名が saikorog.exe だとした場合、秀丸マクロからこれを実
>行するには、runsync2 saikoro.exeとやることになります。このとき、saikoro.exe
> の戻り値は、1,2,3,4,5,6のいずれかになります。この戻り値を秀丸マクロで参照
>したいわけです。
>
>ちなみに、WindowsのCMDコンソールスクリプトで saikoro.exe を実行した場合、プ
>ログラムの戻り値は errorlevel という組み込みの環境変数で参照できるようです。

windowsでは意味のあるリターンコードを返すプログラムはほとんどないですか
らね。知らない方が普通かも(^^;
そんなわけで runsync,runsync2 のリターンコードも需要があまりなさそうなの
で、取得する仕組みは用意されていないと思います。

やるとすれば「外部ファイルを実行し、戻り値の内容を echo などで標準出力に
出力」といったバッチファイルやコンソールスクリプトを用意しておき、
runsync2 からは "cmd.exe /c バッチファイル名" を実行するという形にするく
らいでしょうか。

@echo off
test.exe
echo %ERRORLEVEL%

こんな感じ。

[ ]
RE:25446 外部プログラムからの戻り値No.25448
EA11R さん 08/09/20 19:22
 

EA11R@一般ユーザです。

> 例えば、次のような外部プログラムがあったとします。
> int main( void )
> {
>  サイコロを振る;
>  return( 出目 );
> }
>
> これの実行可能ファイル名が saikorog.exe だとした場合、秀丸マクロからこれを実
> 行するには、runsync2 saikoro.exeとやることになります。このとき、saikoro.exe
>  の戻り値は、1,2,3,4,5,6のいずれかになります。この戻り値を秀丸マクロで参照
> したいわけです。
考えられる案としては…
 1) プログラムはバッチファイルを経由して起動
  バッチファイルのステップ
    1. プログラム実行
    2. errorlevel キーワードを使って戻り値を判定
    3. 適当なフォルダにiniファイル形式のファイルをリダイレクトで作成
 2) 秀丸のマクロでバッチファイルで作成したiniファイルを読んでプログラム
  の実行結果を取得する
が、多分、標準でやれる方法だと思います。
これ、アルビレオさんが提案しているのと同じ方法だと思いますが…。

直接取得したいなら、APIをコールするためのDLLを別途用意してやるしかな
いかもしれませんけど…。

[ ]
RE:25448 外部プログラムからの戻り値No.25449
mshishido さん 08/09/20 20:28
 
EA11Rさん、アルビレオさん、

回答ありがとうごさいます。

なるほど、errorlevelをファイルにリダイレクトしてから秀丸マクロからその内容を
読み取るというアイデアもあったのですね。なかなかきがつきませんでした。参考に
させていただきます。

[ ]
RE:25447 外部プログラムからの戻り値No.25450
Iranoan さん 08/09/21 03:19
 
 mshishido さん今日は、Iranoan です。
> int main( void )
> {
>  サイコロを振る;
>  return( 出目 );
> }
<snip>
> windowsでは意味のあるリターンコードを返すプログラムはほとんどないですか
> らね。知らない方が普通かも(^^;
 main() 関数の返り値としては、使い方が間違っていますね。
 アルビレオさんの方法もありますが、
int main( void )
{
  サイコロを振る;
  printf( "%d", 出目 );
  return EXIT_SUCCESS;
}
とプログラム自体を書き直すのも手だと思います。

[ ]
RE:25450 外部プログラムからの戻り値No.25455
mshishido さん 08/09/22 16:50
 
Iranoanさん、こんにちは。

なるほど、こういう手もありましたか。

ただ、残念ながら実行プログラムのソースファイルが無いのでこの手はつかえません。

ありがとうございました。

[ ]
RE:25449 外部プログラムからの戻り値No.25456
秀丸担当 さん 08/09/22 17:20
 

もう既に解決されたかもしれませんが、将来バージョンでは結果コードも取得で
きるように検討したいと思います。
現状では、Iranoanさん,アルビレオさん,EA11Rさんの書かれているような方法し
かないと思います。
アルビレオさんの方法が一番簡単なのではないかと思います。
アルビレオさんの方法を使う場合、標準入出力を使う場合、runsysc2ではできな
いので、run文を使います。
run "C:\\folder\\test.bat >con";

[ ]