構文
C++
C#
Visual Basic .NET
戻り値
備考
: Windows では、この制限は Win32 の LoadLibrary 関数と FreeLibrary 関数がリエントラントではないことに起因します。
サンプル
C++ (COM) コード
C++ (COM) コード
C# コード
C# コード
HRESULT __stdcall DeinitializeEngine();
int DeinitializeEngine();
Private Declare Function DeinitializeEngine Lib "FREngine.dll" () As Integer
C++ (COM) コード
IEngine* FineReaderEngine = 0;
HMODULE EngineLibraryHandle = 0;
static HRESULT deinitializeEngine()
{
// Engine オブジェクト を解放する
if( FineReaderEngine != 0 ) {
FineReaderEngine->Release();
FineReaderEngine = 0;
}
// DeinitializeEngine を呼び出す
typedef HRESULT (STDAPICALLTYPE* DeinitializeEngineFunc)();
DeinitializeEngineFunc pDeinitializeEngine =
(DeinitializeEngineFunc)GetProcAddress( EngineLibraryHandle, "DeinitializeEngine" );
if( pDeinitializeEngine == 0 || FAILED( pDeinitializeEngine() ) ) {
setLastErrorInfo( L"FineReader Engine をアンロードできません。" );
return E_UNEXPECTED;
}
return S_OK;
}
C# コード
public class EngineLoader : IDisposable
{
// FineReader Engine をアンロードする
public void Dispose()
{
if (engine == null)
{
// Engine はロードされていない
return;
}
engine = null;
// FreeLibrary を呼び出す前にすべての object を削除する
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
int hresult = deinitializeEngine();
hresult = dllCanUnloadNow();
if (hresult == 0)
{
FreeLibrary(dllHandle);
}
dllHandle = IntPtr.Zero;
initializeEngine = null;
deinitializeEngine = null;
dllCanUnloadNow = null;
// クリーンアップ後に例外をスローする
Marshal.ThrowExceptionForHR(hresult);
}
// Kernel32.dll の関数
[DllImport("kernel32.dll")]
private static extern IntPtr LoadLibraryEx(string dllToLoad, IntPtr reserved, uint flags);
private const uint LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008;
[DllImport("kernel32.dll")]
private static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
private static extern bool FreeLibrary(IntPtr hModule);
// FREngine.dll の関数
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private delegate int InitializeEngine( string customerProjectId, string LicensePath, string LicensePassword, , , , ref FREngine.IEngine engine);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate int DeinitializeEngine();
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate int DllCanUnloadNow();
// private 変数
private FREngine.IEngine engine = null;
// FREngine.dll へのハンドル
private IntPtr dllHandle = IntPtr.Zero;
private InitializeEngine initializeEngine = null;
private DeinitializeEngine deinitializeEngine = null;
private DllCanUnloadNow dllCanUnloadNow = null;
}
このページは役に立ちましたか?