freedllしないで終了した場合No.07154
lethalflag さん 12/10/24 01:42
 
お世話になっております。
マクロからDLLを実行する場合についての質問です。

##dllID = loaddll( "foo.dll" );

を実行したあと、freedll を実行しないでマクロを終了し、
後に実行するマクロから解放する手段は存在しない感じでしょうか。
dll内でスレッドを回して、マクロ終了後も継続、
後の任意のタイミングで終了するようなのを作っています。

…そんな使い方するなよ、と言われると苦しいですが;

今のところ、
(1) マクロ実行時、loaddll する。DllMain実行される。
(2) スレッドが走りだし、dllfunc も実行可能。
(3) freedllせずにマクロ終了。スレッドは継続している。
(4) 次にマクロ実行時、同じファイルを loaddll。DllMain関数は実行されていない。
(5) この時のIDで、先ほどのスレッドにアクセス可能。
(6) freedllを実行しても何も起きない。

こんな感じです。
動作を見ると、やはりまずい使い方なのかと思ったりもしますが;
一応、目的の動作は得られるのですが、一旦秀丸を終了しないと
dllを上書き出来ないのが地味に不便だったりする程度です。

[ ]
RE:07154 freedllしないで終了した場合No.07155
秀まるお2 さん 12/10/24 12:13
 
 今ソースコードを見直したんですが、たしかにfreedllしないでマクロ終了す
ると、ロードされたdllがロードされっぱなしになるようです。たぶんわざとそ
うしてるんだと思います。

 ロードしっぱなしになってしまったdllを無理矢理解放することは、現状、マ
クロだけでやるのは無理のようです。

 とりあえずの対策としては、秀丸エディタのプロセス自体を終了すればdllも
解放されるというのはあります。ただ、もしも「動作環境・パフォーマンス・詳
細」の「秀丸エディタの瞬間起動」がONになってると、ウィンドウを閉じてもプ
ロセスとして残ってしまうので、このオプションはOFFにしていただくか、また
は常駐秀丸も含めて全部終了させるかでないとダメになります。


 他の対策としては、C++でdllを作成可能でしたら、例えば解放する用のdllを
別途作成して、それで解放してやるという作戦も可能ですが、そういうのはどう
でしょ?。

 やるとしたら、例えば

extern "C" INT_PTR FreeLibraryForced( char* pszModuleName ) {
    HMODULE hmod = GetModuleHandle( pszModuleName );
    if( hmod != NULL ) {
        return FreeLibrary( hmod );
    }
    return 0;
}

 みたいな関数を作って、それを呼び出すとか。

 ちょっと無理矢理ですけども…。

[ ]
RE:07155 freedllしないで終了した場合No.07158
lethalflag さん 12/10/28 12:42
 
回答ありがとうございます。
ひとまず、

>extern "C" INT_PTR FreeLibraryForced( char* pszModuleName ) {

これを試してみたらうまい具合に開放できたので、
ひとまずこの作戦で行こうと思います。

[ ]