2016-08-12 17 views
0

ネイティブDLLがCOMモジュールから既にロードされているかどうか確認したいですか?私の目的は、適切なDLLがロードされているかどうかをチェックして、対応するメソッドを呼び出せるようにすることです。私はリンク "https://msdn.microsoft.com/en-us/library/system.appdomain.getassemblies.aspx"を参照しましたが、助けにはなりませんでした。私のネイティブモジュールは、デバッグ中にVisual Studioの[Loaded Module]リストウィンドウに表示されませんが、[Enable native code debugging]を設定すると表示されます。同じコードで達成する方法はありますか?実行時にCOMモジュールからWIN32/Unmanaged DLLがロードされているかどうかを調べる

答えて

2

GetModuleHandleにモジュール名を渡します。モジュールがプロセスにロードされている場合は、null以外の値が返されます。

+0

をありがとうございました。それは私を助けた。 :) –

+2

このAPIコールは実際に[TOCTOU](https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use)競合状態のために自分自身を設定しています。一方、[GetModuleHandleEx](https://msdn.microsoft.com/en-us/library/windows/desktop/ms683200.aspx)は、同じチェックを実行できますが、モジュールを増やすことによってメモリにロックしますその参照カウント。返されたハンドルは、その後の[GetProcAddress](https://msdn.microsoft.com/en-us/library/windows/desktop/ms683212.aspx)の呼び出しで安全に使用できます。 – IInspectable

+0

@IInspectable:優秀な点ですが、COMの設計を考えると、それは必要ではないかもしれません。 ['DllCanUnloadNow(...)'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms690368%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396)参照が残っているかどうかを判断するために使用されます。参照を取得することは、モジュールを生かし続けるために必要なすべてのものでなければなりません。 –

0

私はこのように私の問題への解決策が見つかりました:

private bool IsNativDllLoaded(string dllName) 
{ 
    IntPtr module = GetModuleHandle(dllName); 
    return module != IntPtr.Zero; 
} 
関連する問題