Delphi 7 Приложение с функциональностью MAPI Внешнее исключение - PullRequest
0 голосов
/ 23 апреля 2020

«Я отправляю электронные письма, используя Simple MAPI из программы Delphi 7. Это прекрасно работало в течение многих лет. Последние две недели или около того два наших клиента получают сообщение об ошибке». Внешнее исключение 241938E ". Я пытался найти этот код в inte rnet, но о нем ничего не говорится. Кто-нибудь знает эту ошибку? Оба клиента работают на Terminal Server, используя Outlook в качестве почтового клиента на сервере Office 365 "

Приведенное выше сообщение было опубликовано другим автором, но оно было закрыто, я чувствую себя преждевременно. У меня есть ТОЧНЫЕ обстоятельства. Два совершенно не связанных клиента с несвязанными программными пакетами (один разрабатывался в D7 около 10 лет go, один разрабатывался в XE3 около 3 лет go). Единственное, что их объединяет, - они оба используют MAPI для отправки электронных писем и работают в среде Terminal Server. Оба клиента имеют независимую установку нашей программы. ie. у них есть копия приложения, запущенная непосредственно с их рабочего стола. Таким образом, это не общий экземпляр программы, который может использоваться несколькими пользователями одновременно. Я не знаю достаточно о Microsoft Office и его установке. Я предполагаю, что использование этого является общим.

Я встроил EurekaLog, но это было все безрезультатно. Благодаря собственной внутренней регистрации я смог определить точную точку, в которой отображается ошибка. Он находится в вызове для загрузки библиотеки MAPI DLL. Ниже приведена точная строка кода, где MAPIModule - это HModule, а MAPIDLL - это значение прямо из MAPI APi, то есть «MAPI32.DLL».

MAPIModule    := LoadLibrary(PChar(MAPIDLL));

Единственное, что я непреклонен - ​​это то, что это не постоянный Исходя из моих собственных тестов, я смог отправить 2 электронных письма из 13 попыток с интервалом более часа тестирования. Нет времени или причины, почему это сработало в этих двух случаях. Но 11 попыток не увенчались успехом в этом же месте.

[MORE DETAILS]

Приведенный ниже код выполняется для запуска SendMail.

MapiModule - дескриптор, возвращаемый вызовом LoadLibrary. Возвращаемое значение передается в GetProcAddress. GetProcAddress завершается неудачно, и возникает ошибка EXTERNAL EXCEPTION.

К сожалению, я не обладаю глубокими знаниями EurekaLog, но, насколько мне известно, я включил все допустимые параметры. Но файл журнала ошибок никогда не создается.

Несмотря на то, что процедура обработки ошибок фиксирует ошибку и возвращает значение 99 (что я использую для обозначения неопределенной ошибки), интерфейсное приложение становится непригодным для использования. Он не замерз, не разбился. Таймеры работают, и обновление экрана продолжается. Но он блокируется и не может принять запись пользователя - как если бы управление было передано в Outlook для обработки отправки электронной почты, но не возвращено.

Теперь включена декларация SM. Он указывает на функцию, объявленную в MAPI API.

TFNMapiSendMail = function(lhSession: LHANDLE; ulUIParam: ULONG_PTR;
                           var lpMessage: TMapiMessage; flFlags: FLAGS;
                           ulReserved: ULONG): ULONG stdcall;

var SM : TFNMapiSendMail;

MAPIModule    := LoadLibrary(PChar(MAPIDLL));

if MAPIModule = 0 then
begin
  Result := 'MAPI Library not found';
end
else
begin
  try
    @SM := GetProcAddress(MAPIModule, 'MAPISendMail');

    if @SM <> nil then
    begin
      try
        MAPIError := SM(0, Application.Handle, MapiMessage, MAPI_DIALOG or 
                        MAPI_LOGON_UI, 0);
      except
        MAPIError := 99;
      end;
    end
    else
    begin
      MAPIError := 1;
    end;
  finally
    FreeLibrary(MAPIModule);
  end;
end;
...