OpenSharedItem с взаимодействием с Outlook выдает странное исключение в Office 2003, работает с Office 2008
Я использую API взаимодействия Office, чтобы открыть MSG-файл, сохраненный из outlook, и затем показать окно ответа, чтобы позволить пользователю ответить на него.
При работе с 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.
3 ответа
Я отмечаю, что версия 11 библиотеки взаимодействия не содержит OpenSharedItem()
метод.
Он становится доступным начиная с версии 12.
Похоже, что эта операция недоступна в Office 11/2003 (по крайней мере, не с помощью этого вызова метода в любой версии библиотеки взаимодействия).
Я не уверен, подходит ли это для вашего сценария, но у меня был хороший успех с библиотекой погашения Outlook.
Из Что такое погашение Outlook?:
Outlook Redemption работает вокруг ограничений, налагаемых Outlook Security Patch plus, предоставляет ряд объектов и функций для работы со свойствами и функциями, не предоставляемыми через объектную модель Outlook.
Библиотека погашения также включает семейство объектов RDO (Объекты данных погашения), которые могут функционировать как полная замена CDO 1.21 или объектной модели Outlook.
Похоже, что они обходят некоторые из этих странных / противоречивых поведений в разных версиях Outlook (либо по замыслу, либо как "побочный эффект" первоначальной цели).
Если вы не знакомы с CDO, вам будет удобно с RDO. Но, честно говоря, я не знаю, как он "сопоставляется" с Microsoft.Office.Interop.Outlook.
См. http://www.dimastr.com/redemption/rdo/rdosession.htm
Эквивалентная функция RDO для Session.OpenSharedItem()
является RDOSession.GetMessageFromMsgFile()
,
NB. Я никоим образом не связан с этим продуктом, за исключением случаев, когда я его использовал!:-)
Эта проблема возникает при попытке сохранить сообщение, которое содержит большое количество вложений. Когда вы находите сообщение в Outlook, файл меню -> saveas также заканчивается той же ошибкой.
Чтение электронной почты из офиса Outlook 2003 возможно, но не по пути (к файлу.msg), но мы можем читать сообщения электронной почты в папке Outlook (по умолчанию / другие папки) как объект Mail-Items.
Если он закодирован в объектной библиотеке outlook COM-объекта 12.0 и используется в 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);
Вы можете получить доступ к почте и запрограммировать ее.