|
こちら、かなり強力に機能します。
これがあることで、今まで事実上不可能だったことも可能になっています。
ありがとうございます。
組み込んでみて、Hidemaru_EvalMacroを使おうとすると、
それなりに高確率で遭遇するであろうことがあるので「相談」と「問題提起」の
「間」ぐらいのテイストなんですが、投稿させてもらいます。
■問題概要
Hidemaru_EvalMacroを使用する際、
秀丸マクロ環境空間とdll環境空間の値をやり取りするには、
dll自身に定義した export 関数を経由することになるハズですが、
この際に、マクロでloaddllしたバインド変数が不明なため、
マクロ側から、dll側に、loaddllした際の変数名を伝達する必要がある。
というものです。
言葉ではわかりにくいので、実際のソースとなります。
-------------------------------------------------------------------------------
#MYDLL = loaddll( hidemarudir + @"\MyDLL.dll" );
-------------------------------------------------------------------------------
さて、ここで、秀丸マクロ層 ⇒ MyDLL.dllへと
filename2を伝達するには
-------------------------------------------------------------------------------
#_ = loaddll( #MYDLL, "SetStrVar", filename2 );
-------------------------------------------------------------------------------
みたいなことが想定されます。
MyDLL.dllは 「int cdecl SetStrVar(TCHAR *sz);」みたいな関数がexportされてい
ることでしょう。
さて、では、秀丸マクロ層から伝達する必要を感じない場合、
即ち、MyDLL.dllはMyDLL.dll自身で、filename2の情報を得たい場合、
以下のようになります。
-------------------------------------------------------------------------------
hm.EvalMacro = Hideamru_EvalMacro // (Hidemaru_EvalMacroが上手く使えるよう
に定義したメソッドなり関数なりを自前で用意したものとする)
hm.EvalMacro( [[ // [[ ]] はヒアドキュメントのようなものとする
#_ = loaddll( #MYDLL, "SetStrVar", filename2 );
]] );
-------------------------------------------------------------------------------
さて、ここで問題が発生するのです、それはdll内で「#MYDLL」と決めうってしまうと、
マクロ上のloaddllの変数名を束縛してしまう、ということです。
■現行、選択肢としては2つ
リファレンスカウンタは増えてしまうが、気にせず、
ぶつからなさそうな名前で、もう一度loaddllする。
同じdllをloaddllなので、リファレンスカウンタだけで増える状態でしょうから、
dll内部状態などは全て維持されます。
若干気持ちが悪いといえば悪いという感じです。
-------------------------------------------------------------------------------
hm.EvalMacro( [[
#_HIDELOAD = loaddll( hidemarudir + @"\MyDLL.dll" ); ← 実際には、GetMod
uleFileName()みたいなのを使うでしょうが…
#_ = loaddll( #_HIDELOAD, "SetStrVar", filename2 );
]] );
-------------------------------------------------------------------------------
もうひとつの考え方は、dllで束縛したシンボル名をdllに伝えるというものです。
-------------------------------------------------------------------------------
#MYDLL = loaddll( hidemarudir + @"\MyDLL.dll" );
#_ = dllfunc( #MYDLL, "SetBindSelfSimbol", "#MYDLL" );
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
hm.EvalMacro( [[
#_ = loaddll( %s, "SetStrVar", filename2 ); // %sにSetBindSelfSimbol
関数で渡した文字列が入ってるものとする
]] );
-------------------------------------------------------------------------------
いずれにしても、いかに「#MYDLL」を得るのか、
(もっといえば、loaddll関数ではなく、loaddll文もあるのですが、まぁそこはス
ルーするとしても)
「どのように変数に束縛されたのか」を得るのか、ですねぇ〜
このあたりをスマートに解決できないものかなぁ、といったところです。
|
|