[VB2005] 強制釋放 DLL

因為專案的需要,必須呼叫 MAPI 來讓指定的郵件軟體寄出信件,其他的不重要,但船用的郵件軟體 AmosConnector 是一定要測試,AmosConnector 支援 Simple MAPI。
 
VB2005 不支援 VB6 的 MAPI.ocx ,所以直接呼叫 API 處理。
 
若郵件軟體為 Outlook / OE / hotmail / Windows Live ,當程式結束時,都可自動載出 mapi32.dll ,但 AmosConnector 的延伸 MAPI 卻無法載出,導致 mapi32.dll 鎖在記憶體內,當程式結束,執行檔無法正確終結,變成一個無法操控的執行檔死在工作管理員內。
 
最後只好在程式結束時,手動將 mapi32.dll 釋放,讓 AmosConnector 相關 dll 間接被釋放。包含:
C:WINDOWSsystem32MAPI32.DLL
C:Program FilesAmosConnectAmMapi32.dll
C:Program FilesAmosConnectmssudp32.dll
C:Program FilesAmosConnecticonv.dll
C:Program FilesAmosConnectMssApi32.dll
C:Program FilesAmosConnectDBSAPI32.dll
C:Program FilesAmosConnectmsgrules.dll
 
其中比較特別要提的是,ProcessModule 類別沒有 Handle 屬性,一開始找不到 hModule 來提供 FreeLibrary 釋放,只好呼叫 API GetModuleHandle 來比對,原來 ProcessModule.BaseAddress 就是 hModule ,這個線上手冊沒提,解釋的也不清不楚,在這邊補充供大家參考。
 
程式碼如下:

因應 AmosConnector MAPI 無法正確釋放,改為手動強制釋放

Dim currentProcess As Process = Process.GetCurrentProcess()

With currentProcess

     For ibp As Integer = 0 To .Modules.Count – 1

          With .Modules(ibp)

               If LCase(.ModuleName) = "mapi32.dll" Then

                    FreeLibrary(.BaseAddress)

               End If

          End With

     Next

End With

廣告
Categories: 技術分享 | 發表留言

文章分頁導航

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

在 WordPress.com 建立免費網站或網誌.

%d 位部落客按了讚: