3

Office 相互運用 API を使用して、Outlook から保存された .msg ファイルを開き、返信ウィンドウを表示してユーザーが返信できるようにしています。

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();
}

アプリケーションは、Office12 相互運用ライブラリを使用して、.Net 4 を対象としています。AnyCPU用にコンパイルされているかx86用にコンパイルされているかに関係なく、同じことが起こります。

4

3 に答える 3

4

OpenSharedItem()相互運用ライブラリのバージョン 11 にはメソッドが含まれていないことに注意してください。

バージョン12以降で利用可能になります。

この操作は Office 11/2003 では利用できないようです (少なくとも相互運用ライブラリのどのバージョンでもそのメソッド呼び出しを介して)。


これがあなたのシナリオに適しているかどうかはわかりませんが、Outlook Redemption ライブラリでうまくいきました。

Outlook Redemption とは何ですか?から :

Outlook Redemption は、Outlook セキュリティ パッチによって課せられた制限を回避し、さらに、Outlook オブジェクト モデルでは公開されていないプロパティと機能を操作するための多数のオブジェクトと関数を提供します。

Redemption ライブラリには、RDO (Redemption Data Objects) オブジェクト ファミリも含まれており、CDO 1.21 または Outlook Object Model の完全な代替品として機能します。

これらの奇妙で一貫性のない動作のいくつかは、異なるバージョンの Outlook で回避されているようです (設計によるか、元の目標の「副作用」として)。

CDO に精通している場合は、RDO に慣れるでしょう。しかし、正直に言うと、それが Microsoft.Office.Interop.Outlook にどのように "マップ" されるかはわかりません。

http://www.dimastr.com/redemption/rdo/rdosession.htmを参照してください。

の同等の RDO 関数はSession.OpenSharedItem()ですRDOSession.GetMessageFromMsgFile()

注意: 時々使用したことを除いて、私はこの製品とはまったく関係がありません! :-)

于 2012-10-08T13:04:31.180 に答える
0

この問題は、多数の添付ファイルを含むメッセージを保存しようとしたときに発生します。Outlookでメッセージを見つけると、メニューファイル->saveasも同じエラーで終了します。

于 2013-03-15T10:31:16.220 に答える
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ファイルを配置するか、アップグレードされた Office 2007、2010 をインストールすることをお勧めします。これで解決。

Office 2007、2010 などの上位バージョンの Office からの電子メール メッセージを、以下に示す方法で読み取ることができます。

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

メールにアクセスしてプログラムできます。

于 2014-01-31T12:34:47.933 に答える