«Я отправляю электронные письма, используя 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;