|
でるもんた・いいじま@秀丸愛用者です。
> loaddll "tkinfo.dll";
> #n = dllfunc(""NotifyEncode", encode);
> みたいな感じでエンコードの値をHmJre.dll側に
えっと、最初のloaddllの引数は "hmjre.dll" ですよね。
#手元で試そうとしたら、loaddllに失敗しました。
あと、dllfuncの引数に ""NotifyEncode" とあるのも、" がひとつ余計ですね。
☆ ☆ ☆
> NotifyEncode関数の追加ということで対応すると、古いHmJre.dllの
> 場合にdllfunc呼び出しがエラーになるって問題があるのですが、
> 他にいい案が無いです。
ちょっと試してみました。
loaddll "hmjre.dll";
#n = dllfunc("NoSuchFunction", 0);
message sprintf("NoSuchFunction(0) returned %d. result=%d.", #n, result);
endmacro;
dllfunc() の呼び出しに失敗したら result に0が返ってきてくれないかな…と
期待したのですが、マクロがエラー終了してしまいました。
次に、
#hJRE = loaddll("hmjre.dll");
#jreVersion = dllfunc(#hJRE, "JreGetVersion") & 0xFFFF;
message sprintf("JreGetVersion() = 0x%04X", #jreVersion);
としたら 0x0500 と出ました。
なので、こんなコードで回避することも考えられます。
#hJRE = loaddll("hmjre.dll");
#jreVersion = dllfunc(#hJRE, "JreGetVersion") & 0xFFFF;
if ( #jreVersion>=0x0501 ) #n = dllfunc(#hJRE, "NotifyEncode", encode);
// ここに、DLLを呼び出す各種処理を書く
freedll #hJRE;
☆ ☆ ☆
あるいは、秀丸側に dllfuncexist() といった関数を作っていただければ、
loaddll "hmjre.dll";
if ( dllfuncexist("NotifyEncode") )
#n = dllfunc(#hJRE, "NotifyEncode", encode);
とか、
#hJRE = loaddll("hmjre.dll");
if ( dllfuncexist(#hJRE,"NotifyEncode") )
#n = dllfunc(#hJRE, "NotifyEncode", encode);
とか書けると思います。
あるいは、事前にフラグを立てて置いた場合にはdllfunc系での呼び出しに
失敗した場合でもマクロを無条件でエラー終了とはせず、resultにfalseを
返す仕組みを作る、ということも考えられます。loaddll文・loaddll関数に
第二パラメータをつけられるようにする、というのがスマートでしょうか。
ただ、どちらも秀丸本体に手を入れる必要がありますし、古いバージョンの
秀丸でそのマクロを実行したらエラーになるという問題もありますし、
hmjre.dll だけ先行してのバージョンアップもできたほうがいいと思うので、
GetJreVersion() で確認してもらうのが確実なように思います。
☆ ☆ ☆
> dllfuncw/dllfuncstrwで呼び出す用の関数を追加したら万事解決の
> ような気がしました。
そうですね。将来的にはこちらのほうが確実かもしれません。
|
|