|
--- 困ったことになるソース例 -------------
#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時に行うはずだった処理をすることが出来る。
|
|