文章編號: 315458 - 上次校閱: 2004年3月4日 - 版次: 1.3

PRB: 簡易 MAPI BMAPI 功能可能無法正常從 Visual Basic 程式碼

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
重要: 本文包含修改登錄的相關資訊。修改登錄之前請確定它備份起來,並請確定您瞭解如何在發生問題時還原登錄。如如何備份、 還原,以及編輯登錄有關,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
256986? (http://support.microsoft.com/kb/256986/EN-US/ ) Microsoft Windows 登錄的描述
全部展開 | 全部摺疊

徵狀

從 Microsoft Visual Basic 程式碼所做 MAPISendMail 函式呼叫可能會失敗與類似下列的錯誤訊息:
Microsoft Outlook
沒有預設郵件用戶端或是目前的郵件用戶端無法完成訊息的要求。請執行 Microsoft Outlook,並將它設為預設的郵件用戶端。
當 Microsoft Outlook Express 已設為預設的郵件用戶端時,通常就會發生這個問題。

發生的原因

通常使用 Simple MAPI 的 Visual Basic 程式會使用匯入 BMAPI 函式的 Declare 陳述式。當 Outlook Express 是預設的郵件用戶端時,MAPI 虛設常式文件庫無法路由傳送至 Outlook Express 這些呼叫 ; 而是,呼叫失敗而且會顯示錯誤訊息。

解決方案

解決這個問題的一種方法是不使用參考 BMAPI 函式的 Declare 陳述式。不過,因為 Visual Basic 無法呼叫非-BMAPI 函式 (除非您操作所需的結構在二進位層級),您可能要撰寫程式碼來呼叫 Simple MAPI 的函式從可以處理這類 C 或 C + + 結構的語言。

結尾的 < 其他相關資訊 > 一節會提供兩個其他解決方案。

狀況說明

這種行為是經過設計規劃的。

其他相關資訊

MAPI 虛設常式庫 Mapi32.dll,是通常使用 Simple MAPI 的用戶端應用程式所載入的 DLL。虛設常式文件庫將路由根據登錄設定之適當 MAPI 實作的呼叫。以此方式各種實作可同時存在不覆寫彼此。

當 Stub 程式庫所匯出的函式呼叫時,文件庫會依照下列步驟:
  1. 它決定函式為 Simple MAPI 函數或可延伸 MAPI 函式。下列的匯出函式會標記為 Simple MAPI 函數 Stub 程式庫中:

    • MAPIAddress
    • MAPIDeleteMail
    • MAPIDetails
    • MAPIFindNext
    • MAPIFreeBuffer
    • MAPILogoff
    • MAPILogon
    • MAPIReadMail
    • MAPIResolveName
    • MAPISaveMail
    • MAPISendDocuments
    • MAPISendMail

    所有其他匯出函式是延伸 MAPI 函式。
  2. 它看起來以判斷目前的預設 MAPI 實作下列的登錄機碼中:
    HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail::(default)
  3. 它然後在找不到載入正確的 DLL 路徑的用戶端的機碼下的外觀。如果將函式 Simple MAPI 函數它載入 DllPath] 值所指定的 DLL,並呼叫函式。如果將函式的延伸 MAPI 函式它會載入 DllPathEx 值所指定的 DLL。之後尋找適當的 DLL,然後,它會呼叫函式。

    在 Microsoft Outlook 的情況下,例如它會尋找下列機碼下 DLLPathDLLPathEx 的值:
    HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Microsoft Outlook
  4. 如果不找到 DllPathExDllPath,Stub 程式庫就會使用 Mapi32x.dll 檔案位於與 Stub 程式庫相同的目錄中。這個檔案通常是已重新命名的份 Mapi32.dll 檔案已經存在時安裝虛設常式文件庫。特別是那些的許多系統上其中只有 Outlook 和 Outlook Express 都已安裝,這個檔案不存在。
  5. 如果將 Stub 程式庫失敗尋找 Mapi32x.dll,它會顯示位於其中一個下列機碼中的訊息:
    HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail::PreFirstRun

    -或者-

    HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail::NoMailClient
當使用 Outlook Express 問題的原因是,如下所示:
  1. 大多數的 Visual Basic 程式碼使用 Declare 陳述式根據 [Mapivb32.bas] 模組匯入為 BMAPISendMail MAPISendMail。使用其 BMAPI 等也宣告大部分其他 SimpleMAPI 函式。如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
    163216? (http://support.microsoft.com/kb/163216/EN-US/ ) 在 32 位元平台上 Simple MAPI 的更新的 Mapivb32.bas
  2. 因為 BMAPI 函式並不是使用 DllPath 中所指定的 DLL Simple MAPI 函數清單上,虛設常式文件庫將路由它們利用 DllPathEx 中的值。
  3. 因為 Outlook Express 並不會實作延伸 MAPI,它有沒有 DllPathEx 為設定的值。
  4. 虛設常式文件庫會嘗試使用 Mapi32x.dll 不存在,並因此顯示 PreFirstRun 訊息。
有其他兩種方法可以解決這個問題:
  • 暫時的解析度,就是判斷 Outlook Express 是預設郵件用戶端如果它是將 DllPathEx 值加入登錄,如下所示:
    HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Outlook Express::DllPathEx = %ProgramFiles%\Outlook Express\msoe.dll
    警告: 如果您未正確使用登錄編輯程式可能會導致嚴重的問題,甚至必須重新安裝作業系統。Microsoft 不保證您可以解決因不當使用 「 登錄編輯器 」 的問題。使用 「 登錄編輯程式 」,請自行負擔相關的風險。

    因為 Outlook Express 會實作,並將 [BMAPIFunctions Msoe.dll 從匯出,設定 DllPathEx 允許路由呼叫虛設常式庫。在這麼危險是嘗試使用延伸 MAPI 用戶端會收到錯誤訊息 (因為 Msoe.dll 並不會匯出延伸 MAPI 函式) 時它可能改使用 Mapi32x.dll 成功。
  • 若要強制應用程式對所有的 MAPI 呼叫使用 Outlook Express 實作,建立新的值,下列的登錄機碼下:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows 傳訊 Subsystem\MSMapiApps
    設定應用程式 (例如 MyApp.exe) 的名稱值的名稱,然後將值設為 [Outlook Express。這會略過虛設常式文件庫,而且會強制其通過所有的 MAPI 呼叫包括直接對 Outlook Express BMAPI 呼叫。

這篇文章中的資訊適用於:
  • Microsoft Office Outlook 2007
  • Simple Messaging Application Programming Interface (MAPI)
關鍵字:?
kbmt kbmsg kbprb KB315458 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:315458? (http://support.microsoft.com/kb/315458/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。