2012-10-08 59 views
4

我使用Office互操作API打開從Outlook保存的.msg文件,然後顯示答覆窗口以允許用戶回覆它。與Outlook互操作的OpenSharedItem與Office 2003引發奇怪的異常,與Office 2008一起使用

運行Office 2003時,OpenSharedItem(pathToMSGFile);調用拋出以下異常:

Unhandled Exception: System.AccessViolationException: Attempted to read or write 
    protected memory. This is often an indication that other memory is corrupt. 
    at Microsoft.Office.Interop.Outlook._NameSpace.OpenSharedItem(String Path) 
    at OutlookTest.Program.Main(String[] args) 

運行Office 2008時,它工作得很好。

我已經把一個小的測試情況下,代碼如下:

static void Main(string[] args) 
{ 
    try 
    { 
     Application app; 
     string pathToMSGFile = "\\\\path\\to\\foobar.msg"; 

     if (args.Length > 0) 
     { 
      pathToMSGFile = args[0]; 
     } 

     if (!File.Exists(pathToMSGFile)) 
     { 
      Console.WriteLine("{0} does not exist.", pathToMSGFile); 
      return; 
     } 

     Console.WriteLine("Opening {0}", pathToMSGFile); 

     Type olType = Type.GetTypeFromProgID("Outlook.Application", false); 

     app = Activator.CreateInstance(olType) as Application; 

     MailItem fld = (MailItem)app.Session.OpenSharedItem(pathToMSGFile); 

     _MailItem reply = fld.ReplyAll(); 
     reply.Save(); 
     reply.Display(false); 

     Console.ReadKey(); 

     reply.Close(OlInspectorClose.olDiscard); 
    } 
    catch (System.Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 

     if (ex.InnerException != null) 
     { 
      Console.WriteLine(ex.InnerException.ToString()); 
     } 
    } 

    Console.ReadKey(); 
} 

該應用程序的目標是爲.NET 4中,使用OFFICE12互操作庫。無論是爲AnyCPU還是x86編譯,都會發生同樣的情況。

回答

4

我注意到互操作庫的版本11不包含OpenSharedItem()方法。

它從版本12開始可用。

似乎Office 11/2003上的此操作不可用(至少不通過任何版本的互操作庫上的該方法調用)。


我不確定這是否適合您的情況,但我已經與Outlook Redemption庫取得了良好的成功。

What is Outlook Redemption?

展望贖回工作解決由Outlook安全修補程序所施加的限制再加上提供了一些對象和函數的性質與功能,並通過Outlook對象模型不暴露於工作。

兌換庫還包括可用作完整CDO 1.21或Outlook對象模型替換的RDO(兌換數據對象)對象系列。

它似乎規避了這些不同版本的Outlook(無論是通過設計還是作爲原始目標的「副作用」)的這些奇怪/不一致的行爲。

如果您對CDO非常熟悉,那麼您會對RDO感到滿意。但說實話,我不知道它是如何「映射」到Microsoft.Office.Interop.Outlook。

參見http://www.dimastr.com/redemption/rdo/rdosession.htm

等效RDO功能Session.OpenSharedItem()RDOSession.GetMessageFromMsgFile()

注意:我暫時不與本產品有任何關聯,除了我偶爾使用它! :-)

+0

有趣,但我真的不能帶來額外的庫到一個LOB應用程序沒有很大的痛苦。特別是一個不能先審查的封閉源代碼。 – PhonicUK

+1

@PhonicUK我注意到v11互操作庫不包含'OpenSharedItem()'方法。它可以從Office 12版本開始使用。此操作在Office 11/2003中是否無法使用(通過interop)? – Sepster

+0

這似乎確實是問題。如果您想以此作爲答案,我會接受它。 – PhonicUK

0

當您嘗試保存包含大量附件的郵件時,會出現此問題。當您在Outlook中找到消息時,菜單文件 - > saveas也會以相同的錯誤結束。

+0

請嘗試通過添加相關代碼來提高您的答案..在答案中付出了一些努力,所以脂肪酶可以更好地理解您..歡迎來到堆棧溢出:) –

0

從Outlook 2003辦公室閱讀電子郵件是可能的,但不是從路徑(到。msg文件) 但我們可以將Outlook文件夾(默認/其他文件夾)中的電子郵件消息讀取爲郵件項目對象。

如果它在COM對象12.0的Outlook對象庫中編碼,並在Office 2003(它有Outlook 11.0對象庫)中使用,顯然它不會工作!

The Error: Attempted to read or write protected memory. This is often an indication that other memory is corrupt將主要發生如果的.dll文件丟失,所以它能夠更好地把相關的.dll文件或安裝升級辦公室2007,2010。這解決了它。

我們可以通過如下所示的方法閱讀高級版Office 2007,2010等電子郵件。

outlook._Application X=new Outlook.Application(); 
Outlook.MAPIFolder=; //...... Default Folderof outlook 
String Path="......\...\temp.msg"; 
Outlook._MailItem Mail=(Outlook.MailItem)(X.Session.OpenSharedItem(Path); 

您可以訪問郵件並對其進行編程。

相關問題