|
自作EXEプログラムからマクロを呼ぶ目的というのが、どういう目的かによりますが、
マクロ内容が動的に変化するものではなく、単に固定のマクロを実行するだけでよけ
れば、秀丸メールの本体EXEであるTurukame.exeの起動オプション/xでマクロを実行
するだけでもいいかもしれないです。
例
"C:\Program Files\HidemaruMail\TuruKame.exe" /x test.mac
---------
外部のEXEからSendMessageでメッセージを送るのは、不可能ではないですが、プロセ
スをまたぐとメモリのアドレスが変わるので、だいぶん凝ったコードが必要になりま
す。
蛇足かもしれないですが、参考までにサンプルを書いておきます。
以下のような感じにすると外部のプロセスのメモリに書き込んで、そのアドレスを渡
したりできます。
EXE側の例はC++ですが、C++でやるにしても普通は使わないようなメモリの読み書き
が必要になってしまいます。
//マクロ側のサンプル
runex @"C:\Folder\OutprocessSample.exe " + hex(hidemaruhandle(0))
, 0; //0 : 非同期
endmacro;
//EXE側のサンプル
#include <windows.h>
#define WM_HIDEMARUINFO (WM_USER + 181)
#define HIDEMARUINFO_GETTABWIDTH 0
#define WM_REMOTE_EXECMACRO_MEMORY (WM_USER + 272)
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCm
dShow ) {
//引数に16進数のウィンドウハンドルを文字列で指定
HWND hwndHidemaru = (HWND)strtol(lpCmdLine,NULL,16);
if( hwndHidemaru ) {
//まずはプロセスをまたいでも関係無いような、数値だけの受け渡しが成功
しているかどうかを確認
int cTab = (int)SendMessage( hwndHidemaru, WM_HIDEMARUINFO, HIDEMARU
INFO_GETTABWIDTH, 0 );
TCHAR sz[100];
wsprintf( sz, TEXT("cTab %d"),cTab);
MessageBox(0,sz,0,MB_TOPMOST);
//プロセスをまたいで文字列の受け渡しができるかの確認
static WCHAR wszMacroText[] = L"message \"Hello OUTPROCESS\";";
DWORD dwProcessId = 0;
GetWindowThreadProcessId( hwndHidemaru, &dwProcessId );
HANDLE hProcess = OpenProcess( PROCESS_VM_OPERATION | PROCESS_VM_REA
D | PROCESS_VM_WRITE, FALSE, dwProcessId );
if( hProcess ) {
void* pVirtual = (void*)VirtualAllocEx(hProcess, NULL, 4096, MEM
_RESERVE | MEM_COMMIT, PAGE_READWRITE );
if( pVirtual ) {
SIZE_T dwWritten = 0;
WORD w = 4096;
WriteProcessMemory( hProcess, pVirtual, wszMacroText, (wcsle
n( wszMacroText ) + 1) * sizeof(WCHAR), &dwWritten );
SendMessage( hwndHidemaru, WM_REMOTE_EXECMACRO_MEMORY, 0, (L
PARAM)pVirtual );
}
if( pVirtual ) {
VirtualFreeEx( hProcess, pVirtual, 0, MEM_RELEASE );
}
CloseHandle( hProcess );
}
}
return 0;
}
サンプルでwParamの返り値の取得を試そうとしたのですが、うまく動作しないことが
わかってしまって、調べて修正しようと思います。
あと、WM_REMOTE_EXECMACRO_MEMORYの代わりに、WM_REMOTE_EVALMACROのようなメッ
セージを新しく作って、Eval相当のことができたらいいかもしれないです。
これだとマルチスレッドでも判別してdllfuncでも可能かもしれないです。
まず秀丸エディタのほうで試してみて、それから秀丸メールに反映となって先の話に
なってしまうかもしれないですが、将来的なこととして検討したいと思います。
|
|