これは製品コード用ではなく、単体テスト用です。
DLL_PROCESS_DETACH イベントでリソースを解放する従来の DLL があります。静的変数のデストラクタが DLL によってマップされていないリソース (ダングリング参照) にアクセスしようとしたため、実行可能ファイルの静的破棄フェーズでクラッシュ シナリオが発生しました。
修正したことを証明できるように、このクラッシュ シナリオを単体テストで再現したいと思います。
これは製品コード用ではなく、単体テスト用です。
DLL_PROCESS_DETACH イベントでリソースを解放する従来の DLL があります。静的変数のデストラクタが DLL によってマップされていないリソース (ダングリング参照) にアクセスしようとしたため、実行可能ファイルの静的破棄フェーズでクラッシュ シナリオが発生しました。
修正したことを証明できるように、このクラッシュ シナリオを単体テストで再現したいと思います。
GetModuleHandle(LPCTSTR lpModuleName)
を使用してモジュールへのハンドルを取得し、それをに渡すことができる場合がありますFreeLibrary()
。
GetModuleHandle()
州の文書:
この
GetModuleHandle
関数は、参照カウントをインクリメントせずに、マップされたモジュールへのハンドルを返します。ただし、このハンドルがFreeLibrary
関数に渡されると、マップされたモジュールの参照カウントがデクリメントされます。GetModuleHandle
したがって、関数に返されたハンドルを渡さないでくださいFreeLibrary
。これを行うと、DLLモジュールが時期尚早にマップ解除される可能性があります。
そうしないようにという警告にもかかわらず、それはまさにあなたがやろうとしていることのように聞こえます。これは、シナリオでテストして、希望どおりに機能することを確認するのがかなり簡単なはずです。