2

私は実際に登録され、別の.exeプロセスによってロードされているcomサービスであるdllを持っています。手遅れになる前に、ユーザーが.exeを終了して、dll内からリソースを閉じる手順を実行したいと思います。DLLのDllMainからDLLPROCESSDETACHまたはDLLTHREADDETACHをインターセプトしようとしましたが、そこに到達したとき、DLLによって開始されたスレッド(閉じる手順を実行する必要があります)がすでに停止しているため、すでに手遅れになっているようです。もちろん、私は.exeコードを制御しません。そうしないと、そこから呼び出しを呼び出して、終了する前にそれらのクリーンな終了手順を実行することになります。DLL自体でしか作業できません。DllCanUnloadNowまたはDllUnregisterServerも呼び出されていないようです。

この状況を回避できる人はいますか?

何卒よろしくお願い申し上げます。

4

3 に答える 3

1

dtor を使用して静的オブジェクトを作成できます。サービスが終了し、cruntime がアンロードされようとすると、dtor が呼び出されます。

struct CDtorMyDll
{
  ~CDtorMyDll
  {
    // do cleanup stuff here.
  }
};

static CDtorMyDll dtorMyDll;
于 2009-10-18T16:35:26.963 に答える
0

ばかげた質問: 作成したスレッドを実行する必要があるのはなぜですか? とにかくそれらは破棄され、プロセスによって使用されるすべてのリソースがクリーンアップされます。

そうは言っても、オブジェクトが実際に COM オブジェクトである場合は、DllCanUnloadNow 呼び出しにコードを追加して、オブジェクトの未処理のインスタンスがあるかどうかを検出し、ない場合はリソースをクリーンアップできます。プロセスがオブジェクトへの参照をリークするか、CoUninitialize を呼び出さない場合、これは機能しませんが、オブジェクトをホストするプロセスがルールに従っている場合、プロセスがシャットダウンする前にクリーンアップする機会が得られます。

于 2009-10-19T04:49:52.183 に答える
0

DllMain またはデストラクタを介してこれを実行しようとすると、DLL 自体が奇妙な状態になるため、奇妙な結果になります (DllMain に関する Raymond Chen の記事をすべて読んでください)。

ここでの本当の解決策は、プロセスが終了する前に呼び出される明示的な MyDllInitialize() および MyDllTeardown() 関数を用意することです。

于 2009-10-20T01:16:00.370 に答える