著作一覧 |
WIN32OLEのパッチでIGlobalInterfaceTableからRevokeするためのタイミングを調べようといろいろ試したが、まったくうまくいかないのである意味驚いた。
win32ole.so自体はDLLだから、DllMainを記述すれば各種イベントが取れるだろうと考えた。
それ自体は正しく、PROCESS_ATTACHEだのPROCESS_DETACHだのは取得できる。が、この中からCOMの呼び出しは案の定不可能。ハングしてしまう。
ではTHREAD_DETACHだと思ったら、すべてのスレッドについて呼ばれるわけではないことに気づく。なんだこれ?
つまり、こんなことを考えた。
Init_win32oleの中でモニタースレッドを起動し、Init_win32oleを呼び出したスレッドのTHREAD_DETACHの中でモニタースレッドに対してメッセージをポストし、そのスレッド内でRevokeさせるという方法だ。
が、モニタースレッドはいつの間にか消失してしまう。THREAD_ATTACHはあるが、THREAD_DETACHもない。
メッセージを取るわけだから、GetMessageを使うメッセージポンプを作るわけだが、GetMessageの呼び出しの中で静かに殺されてしまう。WM_QUITも無い。うーむ。これでは、どうにも打つ手がない。あとは、Kernel.exitの中で、requireされた(というよりもInit_xxxxを呼び出した)DLLに対して、もし定義されていたら、Exit_xxxxを呼び出すように本体に手を入れるとかしかないのではなかろうか。というか、そういう方法はありかな?
ジェズイットを見習え |
すいません。まだ時間が取れなくて見てないのでよくわかっていないのですが、at_exit を使うとかは駄目なんでしょうか?
試したのですがハングします。メッセージキューがなくなった後か、ole32.dllをアンロードした後で呼ばれるのではないかと思います。
すみません。C関数のatexitと勘違いしました。Kernel.at_exitですね。それならOKです。