[ 新規に投稿する ]

マクロがエラーで途中終了した際、dllをfinally句的に解放すNo.10384
こみやんま さん 21/05/09 17:34 [ コメントを投稿する ]
 
--- 困ったことになるソース例 -------------
#DLL = loaddll(hidemarudir + @"\hmNative.dll");

// #r = dllfuncw(#Dll, ....); // 何かdllで有効なことやったとする

message "PREV";
message 1; // ここまでで実行が停止されてしまう。

// 実行されない。
message "POST";

// 実行されない。
freedll(#DLL);


----------------
setdlldetachfunc とは異なりますが、「マクロが途中停止してしまったなど事故った際でも、とにかくfreedll相当の挙動をしてください」
という指定(事前登録|事前指定)をする命令文があった方がよいように思えます。






--以下、検証が考案したが、「それはどうなのよ...」と思った次第----------------------------------

現状でもCOMの形式で汎用的にラップすることで、どんなloaddllだろうと、
そして、「途中の致命的エラーでマクロが停止」してしまったとしても下記のような形で解放できるようにはできますが、
かなりわかりにくい仕組みになってしまうと思います。

#pycom = createobject(hidemarudir + @"\hmManagedDll.dll";
#r = method("registloaddll", hidemarudir + @"\hmNative.dll"); // hmManagedDll.dllにこのようなメソッドがあるとする。
setcomdetachmethod #pycom, "Dispose"; // Disposeメソッドで、registloaddllされたdll群は解放するような処理がなされているとする

message "PREV";
message 1; // ここまでで実行が停止されてしまう。

// 実行されない。
message "POST";

// しかし(keepしない限り)COMオブジェクトがマクロ変数が破棄されるタイミングで、releaseobject 相当が呼び出されるため、
// 上記Disposeが呼び出され、マクロが想像にしていないような途中停止するような処理をしようとも、
// hmManageDll内のDisposeメソッドが実行され、そのメソッド内で、hmNative.dllのfreedll時に行うはずだった処理をすることが出来る。
[ ]
RE:10384 マクロがエラーで途中終了した際、dllをfinally句的にNo.10387
秀丸担当 さん 21/05/10 11:17 [ コメントを投稿する ]
 
loaddllとcreateobjectは、解放のされ方は確かに違っています。
createobjectのほうは、keepobject #obj,0;相当で、マクロ終了時や、マクロのエラーで終わるときにも開放されます。
keepobject #obj,2;とすると、loaddll同様に解放しないです。

loaddllのほうも、keepdll #dll,#n;みたいに、解放のされ方を指示できたらいいと思います。
keepdll文の追加を検討します。


[ ]
RE:10387 マクロがエラーで途中終了した際、dllをfinally句的No.10389
こみやんま さん 21/05/11 01:38 [ コメントを投稿する ]
  >loaddllのほうも、keepdll #dll,#n;みたいに、解放のされ方を指示できたらいいと思います。
>keepdll文の追加を検討します。
ご検討ありがとうございます。よろしくお願いいたします。
[ ]

[ 新規に投稿する ]