マクロの要望No.06855
foobarr さん 12/02/18 14:55
 
こんにちわ。

最近、複数のプロセス(.exe)と連携するマクロを書くことが多いのですが、runexを
「非同期フラグ=ON」で呼んだときに、プロセスが終了したかどうかを知りたいです。

マクロを拡張してこのような記述ができるようにならないでしょうか?

(秀丸マクロを拡張したときの記述例)
//一つ目のプロセス起動
runex foo.exe,0,...
#process_handle[0]=getresultex(15);  //15==runexで生成したプロセスのハンドル
を取得する

//二つ目のプロセス起動
runex bar.exe,0,...
#process_handle[1]=getresultex(15);

//複数のプロセス(今回は2個)の終了を待つ。(Timeout=100msec)
wait_for_multiple_objects #process_handle, 2, 100;

//1つのプロセスが終了するまで待つ。(Timeout=100msec)
wait_for_single_object #process_handle[0],100;


Win32-APIのWaitForMultipleObjectsEx/WaitForSingleObjectと同じようなものが欲
しいです。
resultの値は上記APIと同じものが望ましいです。


runexはCreateProcessを呼び出していると思うのでプロセスが終了したかどうかの問
い合わせは出来るかと思います。

何分ニッチな機能ですが、ご検討頂ければ幸いです。
(時間のかかる処理を秀丸マクロからexe側へ逃がしたいので・・・)

[ ]
RE:06855 マクロの要望No.06856
秀まるお2 さん 12/02/18 16:50
 
 プロセスのコントロールやwait類をマクロ標準対応するのはちょっと
マニアックな気がするので、それを秀丸エディタ・マクロで標準対応するのは大
変だと思います。

 秀丸メールの方では、tkinfo.dllっていうdllがあって、それにいろいろと
Bypass_XXXって感じでWindowsのAPI呼び出し出来るようにしているんですが、そ
ういう感じの拡張DLLを提供するって形の対応ならいいかなぁという気はします
けども…。似たようなソフトで田楽DLLってのがあります。

 田楽DLLでもプロセスのコントロール関係までは無いようです。

 とりあかえず、僕にとって一番簡単なのは、秀丸メールのtkinfo.dllに適当な
Bypass_XXXX関数追加するって形になりますが、それではダメでしょうか。一般
ユーザー様向けのマクロってことじゃなくてご自身、あるいは特定の組織内で使
うだけでしたら、秀丸メールのtkinfo.dllを使うってことでもそんなに問題ない
ような気がします。(ライセンス的にも問題無いし)

 僕的には、言われた関数をそのまんまBypass_XXXで追加するだけってことなら
非常に簡単に対応出来ますが、CreateProcessみたいに構造体がパラメータにな
ってる物はそのままでは対応出来ないので、その辺適当にパラメータ修正してっ
て感じの対応にはなります。

 例えばCreateProcessなら、

INT_PTR Bypass_CreateProcess( char* pszCommandLine );

 って関数を追加して、返す値がプロセスハンドルってことにして、

INT_PTR Bypass_WawitForSingleObject( INT_PTR handle
            , INT_PTR dwWaitMillisec );

 とかの関数も追加するとか。

 そんな感じでどうでしょうか。

 それか、ご自身でDLL作ってしまう手もあります。

 あと他には、Windows Scripting Host用に提供されてるCOMオブジェクト類を
呼び出すことも秀丸で出来ます。ただし今回のご要望を実現出来そうな適当な
クラス/メソッドは無いかなぁという気がします。

[ ]
RE:06856 マクロの要望No.06857
IKKI さん 12/02/19 06:04
 
こんにちは。ユーザの IKKI です。

>  あと他には、Windows Scripting Host用に提供されてるCOMオブジェクト類を
> 呼び出すことも秀丸で出来ます。ただし今回のご要望を実現出来そうな適当な
> クラス/メソッドは無いかなぁという気がします。

WshScriptExec オブジェクトが使えませんか?

#shell = createobject("WScript.Shell");
#exec = callmethod_returnobj(#shell, "Exec", "calc.exe");
while (getpropnum(#exec, "Status") == 0) {
 sleep 100;
}
message str(getpropnum(#exec, "Status"));

[ ]
RE:06857 マクロの要望No.06858
foobarr さん 12/02/20 12:08
 
COMやWSHなどと連携するのは盲点でした、すいません。

教えて頂いた方法で何とかやれそうです!!

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

[ ]