マクロがエラーで途中終了した際、dllをfiNo.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"); // hmManagedDl
l.dllにこのようなメソッドがあるとする。
setcomdetachmethod #pycom, "Dispose"; // Disposeメソッドで、registloaddllさ
れたdll群は解放するような処理がなされているとする

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

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

// しかし(keepしない限り)COMオブジェクトがマクロ変数が破棄されるタイミングで、
releaseobject 相当が呼び出されるため、
// 上記Disposeが呼び出され、マクロが想像にしていないような途中停止するような
処理をしようとも、
// hmManageDll内のDisposeメソッドが実行され、そのメソッド内で、hmNative.dll
のfreedll時に行うはずだった処理をすることが出来る。

[ ]
RE:10384 マクロがエラーで途中終了した際No.10387
秀丸担当 さん 21/05/10 11:17
 

loaddllとcreateobjectは、解放のされ方は確かに違っています。
createobjectのほうは、keepobject #obj,0;相当で、マクロ終了時や、マクロのエ
ラーで終わるときにも開放されます。
keepobject #obj,2;とすると、loaddll同様に解放しないです。

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



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

[ ]