[ 新規に投稿する ]

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内でメッセージを受けるとしたら、MsgWaitForMultipleObjectsのQS_SENDMESSAGEで待ちつつループするとか、スレッドと同期しながらの面倒な処理が必要になってくると思います。
動作確認としてのメッセージを受けるためのメッセージループであれば、_beginthreadexの後に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_REMOTE_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_EVALMACRO,そうでなければ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_EVALMACROかWM_REMOTE_EXECMACRO_MEMORYを変えて実行させるようなことは想定していないので、できたら避けるようにしてほしいところです。

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

[ 新規に投稿する ]