Моя программа Delphi полагается в большой степени на автоматизацию Outlook. Версии Outlook до 2007-SP2 имеют тенденцию застревать в памяти из-за плохо записанных дополнений и плохо написанного кода Outlook.
Если Outlook застревает, называя CreateOleObject ('Outlook. Приложение'), или GetActiveObject... не возвращает и сохраняет мое приложение, зависающее, пока Outlook.exe не закрывается в диспетчере задач.
Я думал о решении, но я не уверен, является ли это хорошей практикой или нет.
Я запустил бы Outlook с CreateOleObject в отдельном потоке, ожидал бы 10 секунд в моем основном потоке и если Outlook зависает (CreateOleObject не возвращается), предложите пользователю для уничтожения процесса Outlook.exe из моей программы.
Но так как я не хочу вынуждать пользователя уничтожить процесс Outlook.exe, как альтернатива мне также нужен способ уничтожить новый поток в моей программе, которая продолжает зависать теперь.
Windows имеет TerminateThread , но, как вы можете видеть из примечаний, в целом использовать ее не рекомендуется. Более безопасным подходом было бы иметь дополнительное приложение, которое взаимодействует с Outlook, и вы могли бы затем убить его, не влияя на стабильность вашего собственного приложения. TerminateProcess подойдет, но если вы хотите быть более дружелюбным к системе, у доктора Доббса есть статья о возможно более безопасном подходе с использованием ExitProcess.
Если зависание происходит постоянно и либо происходит, либо не происходит, вы можете просто вызвать CreateOleObject в приложении и выйти, а затем вызвать его снова из своего собственного. Если это несовместимо, вторичное приложение может быть более полной оболочкой, и все взаимодействия будут проходить через нее.
Кроме того, вы можете использовать регистр eip контекста потока.
Вы можете найти образец по адресу: