語法
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"Can't unload 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 前先刪除所有物件
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 FREngine.IEngine engine = null;
// FREngine.dll 的 Handle
private IntPtr dllHandle = IntPtr.Zero;
private InitializeEngine initializeEngine = null;
private DeinitializeEngine deinitializeEngine = null;
private DllCanUnloadNow dllCanUnloadNow = null;
}
這個頁面有幫助嗎?