WM_REMOTE_EXECMACRO_MEMORYのヘルプ誤記No.38106
あべのり さん 20/04/03 04:16
 
「マクロ実行するメッセージ」のWM_REMOTE_EVALMACROに関してです.

* ヘルプ内にミスがあるようです.LPARAMとして渡される値はマクロの中身でないと
ならないと思いますが,例にはファイル名らしきものが挙がっているようです.
* こちらは質問です.このSendMessageによるマクロ実行もHidemaru_EvalMacroと同
様,同じスレッドから発する必要はあるのでしょうか?

手元のバージョンは秀丸 8.91 32bitバージョンです.よろしくお願いします.

[ ]
RE:38106 WM_REMOTE_EXECMACRO_MEMORYのヘNo.38110
秀丸担当 さん 20/04/03 09:27
 

サンプルのご指摘ありがとうございます。
その通りでした。修正しておきます。
WM_REMOTE_EVALMACROは、別スレッドからメッセージを送ったとしても、必ずメイン
スレッドで処理されるので、メッセージを送ること自体は問題無いはずです。
PostMessaeで送った後にメモリが解放されるようなことはよくなくて、SendMessage
して帰ってくるまで別スレッドは待つ状態になっていればいいと思います。
メインスレッドは、いわゆるメッセージループ等でメッセージを処理できるような状
態である必要があります。

[ ]
RE:38110 WM_REMOTE_EXECMACRO_MEMORYのヘNo.38112
あべのり さん 20/04/03 11:16
 
>WM_REMOTE_EVALMACROは、別スレッドからメッセージを送ったとしても、必ずメイン
>スレッドで処理されるので、メッセージを送ること自体は問題無いはずです。

ありがとうございます.ちょっと困ってしまったのでお知恵をお貸しいただけるとあ
りがたいです.

次のような小さいサンプルを作ってみました.
#include <windows.h>
#include <string>
#include <process.h>

#define WM_REMOTE_EVALMACRO (WM_USER + 282)

void showmessage(HWND hwnd){
 auto x = SendMessage(hwnd,WM_REMOTE_EVALMACRO,NULL,(LPARAM)L"message \"str\
";");
 MessageBox(NULL,(std::to_string(x)).c_str(),NULL,0);
}

unsigned int WINAPI testthread(void *arg){
 showmessage((HWND)arg);
 return 0;
}

extern "C" __declspec(dllexport) int test(int handle){
 showmessage((HWND)handle);
 _beginthreadex(nullptr,0,testthread,(void*)handle,0,nullptr);
 return 0;
}

これをtest.cppとして保存し,cl /EHcs /LD test.cpp user32.libとしてtest.dllを
作り,秀丸からは次のように呼び出しました.

loaddll "test.dll";
##_ = dllfunc("test",hidemaruhandle(0));
freedll;

するとtestthreadから送ったメッセージは失敗してしまいました.いただいたお返事
だとこれでも問題なさそうなのですが.
使用バージョンは秀丸8.91とVisual Studio 2017です.

[ ]
RE:38112 WM_REMOTE_EXECMACRO_MEMORYのヘNo.38113
秀丸担当 さん 20/04/03 11:55
 

この例の場合、メインスレッドは_beginthreadexで作成後、dllfuncを抜けてマクロ
終了する途中か、マクロが終わった後かどこかわからないところでメッセージを受け
ることになってしまうと思います。

_beginthreadexしてから、dllfunc内でメッセージを受けるとしたら、MsgWaitForMul
tipleObjectsのQS_SENDMESSAGEで待ちつつループするとか、スレッドと同期しながら
の面倒な処理が必要になってくると思います。
動作確認としてのメッセージを受けるためのメッセージループであれば、_beginthre
adexの後にMessageBoxを一行書いておくと、MessageBox自体がメッセージループを持
っているので、それで確認できると思います。

[ ]
RE:38113 WM_REMOTE_EXECMACRO_MEMORYのヘNo.38114
あべのり さん 20/04/03 13:05
 
ありがとうございます.

>この例の場合、メインスレッドは_beginthreadexで作成後、dllfuncを抜けてマクロ
>終了する途中か、マクロが終わった後かどこかわからないところでメッセージを受
>けることになってしまうと思います。

確かにスレッド作成直後にMessageBoxを入れたら動くようになりました.ただ「マク
ロが終わった後かどこかわからないところでメッセージを受ける」のがなぜまずいの
かわかっていません.もしかしてWM_REMOTE_EVALMACROは秀丸本体がマクロ実行中で
ないとならないのでしょうか?

(本体がマクロを動かしていなくてもEvalMacroしたい,というのが目的でいます.)

[ ]
RE:38114 WM_REMOTE_EXECMACRO_MEMORYのヘNo.38115
秀丸担当 さん 20/04/03 13:21
 

WM_REMOTE_EVALMACROは、マクロ内で実行することを想定しています。
例えば、dllfunc内で"#a=123;#b=456;"とか実行してreturnせずに変数の代入をした
いといったときに使えます。
Hidemaru_EvalMacro関数も同じです。
マクロ実行中でないときは使えないです。

WM_REMOTE_EXECMACRO_FILEや、WM_REMOTE_EXECMACRO_MEMORYは、マクロを実行してい
ないときに、新しくマクロを実行することを想定しています。
普通にマクロ登録したマクロを実行するのと同じ感覚です。
こちらはマクロ実行中だと使えないです。

マクロ実行していないときに、メモリ上のマクロを新しく実行するとしたら、WM_REM
OTE_EXECMACRO_MEMORYを使うのがいいです。

[ ]
RE:38115 WM_REMOTE_EXECMACRO_MEMORYのヘNo.38116
あべのり さん 20/04/03 14:03
 
>Hidemaru_EvalMacro関数も同じです。
>マクロ実行中でないときは使えないです。
なるほど,了解しました.ちなみになのですが,マクロA内でdllfuncしたDLLが,マ
クロA終了後WM_REMOTE_EVALMACROを飛ばし,たまたまそのとき別のマクロBが動いて
いた場合,WM_REMOTE_EVALMACROによるマクロ実行は行われるのでしょうか?

WM_ISMACROEXECUTINGでマクロ実行中かをチェックし,実行中ならばWM_REMOTE_EVALM
ACRO,そうでなければWM_REMOTE_EXECMACRO_MEMORYで必ずマクロ実行を行えるかを気
にしています.

[ ]
RE:38116 WM_REMOTE_EXECMACRO_MEMORYのヘNo.38117
秀丸担当 さん 20/04/03 15:03
 

>なるほど,了解しました.ちなみになのですが,マクロA内でdllfuncしたDLLが,マク
>ロA終了後WM_REMOTE_EVALMACROを飛ばし,たまたまそのとき別のマクロBが動いていた
>場合,WM_REMOTE_EVALMACROによるマクロ実行は行われるのでしょうか?

たまたまそういうことになったら、実行できてしまうと思います。
WM_REMOTE_EVALMACROは、メインスレッドのマクロやDLLが管理している範囲で呼ばれ
るようになっているべきで、マクロが実行中かどうかによってWM_REMOTE_EVALMACRO
かWM_REMOTE_EXECMACRO_MEMORYを変えて実行させるようなことは想定していないので、
できたら避けるようにしてほしいところです。


[ ]
RE:38117 WM_REMOTE_EXECMACRO_MEMORYのヘNo.38118
あべのり さん 20/04/03 15:33
 
>たまたまそういうことになったら、実行できてしまうと思います。
>WM_REMOTE_EVALMACROは、メインスレッドのマクロやDLLが管理している範囲で呼ば
>れるようになっているべきで、マクロが実行中かどうかによってWM_REMOTE_EVALMAC
>ROかWM_REMOTE_EXECMACRO_MEMORYを変えて実行させるようなことは想定していない
>ので、できたら避けるようにしてほしいところです。

ありがとうございます.了解です.たまたま実行されている可能性は低いと思うので,
実行されていたら諦めるようにしておこうと思います.色々とありがとうございまし
た.

[ ]