Вопрос

У меня возникла проблема с приложением Delphi на некоторых серверах Windows 2003.Он использует вызов веб-сервиса для соединения с другим сервером и передачи данных туда и обратно.Как только приложение переходит к методу аутентификации, приложение умирает.Приложение годами работало на предыдущих версиях с Win Server 2003, но не на новых машинах.Машины по большей части настроены одинаково, но явно есть какие-то отличающиеся настройки конфигурации, которые я не могу отследить.Кроме того, хотя ошибка становится очевидной при вызове аутентификации, перехват пакетов доказывает, что между приложением и сервером, с которым оно пытается связаться, никогда ничего не происходит, что укрепляет мои мысли о том, что что-то не так на ранней стадии настройки соединения.Я не могу дублировать ошибку локально, поэтому я также не могу выполнить пошаговый запуск приложения в отладчике.Есть какие-нибудь мысли о том, почему веб-соединение Indy 9 Delphi может беззвучно завершаться сбоем?

Это было полезно?

Решение

Вот тут-то все и взорвалось:

MySoapObject := GetNewSoapObject(usewsdl, addr, FHTTPRIO);  
 ...   
if MySoapObject <> nil then   
  MySoapObject.SomeFunction(); // BOOM! Access Violation here.

Решение найдено!Оказалось, что это DEP (Предотвращение выполнения данных).Когда я заново собрал наш код с помощью библиотек soap Delphi2007, проблема исчезла.Поскольку я не хотел этого делать (десериализация вызывала проблемы, из-за которых сервер захлебывался нашим XML), а мой mgr действительно не хотел этого делать (требовало обширного регрессионного тестирования), я искал различия между исходным кодом SOAP между D2005 и D2007, с идеей внести целевые изменения во все, что отличалось между ними.то есть найдите разницу, которая имеет значение. Вне всякого сравнения здесь был мой приятель.Одно изменение показалось странным - RIO.PAS теперь включает в себя новое подразделение PrivateHeap.pas.Задаваясь вопросом, почему, я погуглил и нашел похожую проблему с объяснением, которое, казалось, попало точно в цель.

Тот самый ДЕП проблема в основном заключается в том, что начиная с пакета обновления Windows XP 2, если ваше оборудование способно, Windows предотвратит выполнение кода из неисполняемой памяти.К сожалению, среда выполнения Delphi SOAP создает кучу ошибок, и память, выделенная для них, не была помечена как исполняемая.Таким образом, когда обновление OS было выпущено на работоспособном оборудовании, вы получили бы Когда AV вызывая метод опирается на Рио компонент.Эта проблема была устранена в обновлении с подразделением PrivateHeap.
-- Jean-Marie Babet
http://delphigroups.info/2/11/344230.html

Бинго!Теперь вот где все становится сложнее.DEP всегда был включен на наших серверах.Так что поначалу это казалось маловероятным.Но DEP - штука сложная, и новое оборудование обладает большими возможностями, чем старое.Так что я думаю, что в прошлом нам сходили с рук проблемы с DEP, а теперь новое оборудование ставит нам подножку.Администратор нашего сервера отключил защиту DEP (для сторонних приложений), перезагрузился, и наш старый код заработал!Хотя мы в конечном итоге перейдем на более новые библиотеки, для нас это будет отличным краткосрочным решением, поскольку позволит избежать необходимости регрессионного тестирования этого приложения, которое в остальном работает нормально.

Итак, подведем итог:Наше приложение Delphi2005 выходило из строя на недавно созданных серверах Windows2003 из-за предотвращения выполнения данных (DEP), мешающего созданию объекта HTTPRIO.Правила, которые были бы созданы без исключения, казались действительными.Но когда был использован связанный объект IInvokable, это привело бы к нарушению доступа, прежде чем пытаться вообще установить связь по проводу.Спасибо нашим отзывчивым и очень терпеливым администраторам, коллеге дэву Макмару, Beyond Compare и Жану-Мари Бабе.

Другие советы

Может ли быть причиной проблем в 2003 году брандмауэр?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top