ExecAt, ExecAtMain関数(TKInfo.dll)(Ver7.30対応版)
ExecAt関数
 ExecAt関数は、現在のウィンドウとは別のウィンドウ上でTKInfo.dllの関数呼び出しを実行します。例えば、CurrentAccount関数は、現在のウィンドウでのアカウントを返しますが、 例えばエディタが起動している状態で秀丸メール本体側のCurrentAccountの値を取り出したい時に使います。

 ExecAt関数は、スレッドをまたがってSendMessageすることで実現されているもので、もし、呼び出した先のスレッドが呼び出し元のスレッドに何か要求するような操作をすると、そこでデッドロック状態となり、秀丸メールが固まってしまいます。具体的には、 NextUnread/PrevUnreadなど、メールの選択を切り替える関数や、その他、秀丸メールのウィンドウに何らかの変化をもたらせる関数物は一切使えません(スレッド間での排他制御をしようとして固まります)。

 もしもデッドロックが発生して固まってしまった場合には、20秒後にエラーメッセージが表示されて復旧するように作ってあります。たたし、その後の秀丸メールの動作は不安定になる可能性が高いです。


ExecAtMain関数
 ExecAtMain関数は、エディタウィンドウ上から秀丸メール上でのtkinfo.dll呼び出しを行う専用の関数です。ExecAtMainは、ExecAtと違い、20秒の時間制限が無く、非常に時間のかかる処理でも「デッドロック」のエラーが起きることなく処理できます。


ExecAt関数でのパラメータ1(数値型)
 実行対象のウィンドウハンドルを指定します。秀丸マクロのhidemaruhandleを使って取得したハンドルを指定するか、またはTKInfo.dllの"MainWnd"関数を使って得た秀丸メール本体ウィンドウのハンドルが指定できます。

ExecAt関数でのパラメータ2(文字列型)、および、ExecAtMain関数でのパラメータ1
 実行したい関数名を指定します。


以降のパラメータ(数値型、文字列型不定)
 実行したい関数についてのパラメータを追加で指定してください。


返り値
 返り値は、関数の返り値そのままです。文字列型か数値型かはこの関数によって決まります。


#main = dllfunc("MainWnd");
$account = dllfuncstr("ExecAt", #main, "CurrentAccount");

#n = dllfunc("ExecAtMain", "SetFindPack", "(\"abc\", target=all), inmail=3");
if( dllfunc("ExecAtMain", "FindDownInclude") ) message "ありました";
else message "ありません";