|
・現在、(秀丸から呼び出すの形ではない)外部プログラムから、
秀丸のアウトプット枠に文字列を表示したいと考えております。
・外部プログラムは、いわゆる、ずっとforループしてるような
「常駐」タイプであるため、秀丸のrunex系マクロを使用してしまうと、
アウトプット枠のプロセスが占領されてしまい、
他のマクロからのアウトプット枠への表示を受け付けなくなってしまいます。
・そこで、外部プログラム自身が、HmOutputPane.dllをロードし、
(該当dllの)Output関数を実行すればよいのではないかと思い、
実験サンプルとなるC言語プログラムを作ったのですが、
Push関数によるクリアは機能するものの、Output関数は機能しません。
・実験で制作したソースは以下のものです。
#include <windows.h>
#include <stdio.h>
typedef int (_cdecl *PFNOUTPUT)(HWND hwnd, const char *);
typedef int (_cdecl *PFNPUSH)(HWND hwnd);
void main(void) {
HWND hHidemaru = FindWindow("Hidemaru32Class", NULL);
if (!hHidemaru) {
return;
}
/*
HWND hCldHidemaru = GetWindow(hHidemaru, GW_CHILD);
printf("%d", (int)hHidemaru);
*/
if ( !hHidemaru ) {
MessageBox(NULL, "NOHIDE", "NOHIDE", NULL);
return;
}
HMODULE hHmOutputPane=LoadLibrary("HmOutputPane.dll");
if ( !hHmOutputPane ) {
MessageBox(NULL, "NPANE", "NOPANE", NULL);
return;
}
PFNPUSH pPush = (PFNPUSH)GetProcAddress( hHmOutputPane, "Push" );
((PFNPUSH) pPush)((HWND)789214);
PFNOUTPUT pOutput = (PFNOUTPUT)GetProcAddress( hHmOutputPane, "Output" );
((PFNOUTPUT) pOutput)((HWND)789214, "abc\n");
printf("End");
}
※上記ソースの789214といった数値の部分は、実際には、
秀丸エディタのウィンドウハンドルの数値を入れる必要があります。
(秀丸マクロでいうhidemaruhandle(0)です)
・質問の1つ目となりますが、
上記ソースを実行した場合、Pushは実行できますが(アウトプット枠がクリアされ
る)、
Outputは実行できません。これはなぜなのでしょうか…
Outputを実行するにはどのようにすればよいのでしょうか。
・質問の2つ目となりますが、
上記789214の部分は、実際には、秀丸マクロ上でのhidemaruhandle(0)相当の
数値(ウィンドウハンドル)が必要となります。
しかし、hidemaruhandle(0)は、秀丸のどのタブがアクティブなのかで
変化してしまうため、事前に外部プログラムに引数として渡す(一種の静的な手段)
のには無理があります。
C言語側で、hidemaruhandle(0)と等しいハンドルを取得する手段は
ありますでしょうか?
(GetWindowのwin32関数等を使って調べてみましたが、わかりませんでした…)
以上、よろしくお願い致します。
|
|