У меня возникла проблема с приложением Delphi на некоторых серверах Windows 2003. Он использует вызов webservice для подключения к другому серверу и передачи данных взад и вперед. Как только приложение переходит к методу Authenticate, приложение умирает. Приложение долгое время работало на предыдущих блоках с Win Server 2003, но оно не на недавно построенных машинах. Машины настроены одинаково по большей части, но есть определенная настройка конфигурации, которая отличается тем, что я не могу отслеживать. Кроме того, хотя ошибка возникает при вызове Authenticate, обнюхивание пакетов доказывает, что между приложением и сервером, с которым он пытается связаться, ничего не происходит, что усиливает мои мысли о том, что на раннем этапе чего-то начинает налаживаться соединение. Я не могу дублировать ошибку локально, поэтому я не могу пройти через приложение в отладчике. Любые мысли о том, почему веб-соединение Indy 9 Delphi может неожиданно провалиться?Несовместимость между Indy 9 и Windows Server 2003?
ответ
Вот где взрывал:
MySoapObject := GetNewSoapObject(usewsdl, addr, FHTTPRIO);
...
if MySoapObject <> nil then
MySoapObject.SomeFunction(); // BOOM! Access Violation here.
Решение найдено! Оказалось, что это DEP (Data Execution Prevention). Когда я перестроил наш код с помощью мыльных библиотек Delphi2007, пробник ушел. Поскольку я не хотел этого делать (десериализация вызвала проблемы, которые заставляли сервер задыхаться от нашего XML), и мой mgr действительно не хотел этого делать (включая обширное регрессионное тестирование), я искал различия между SOAP исходный код между D2005 и D2007, с идеей сделать целенаправленное изменение на все, что было между ними. я вижу разницу, которая имеет значение. Beyond Compare был моим приятелем здесь. Один вид изменения выделялся как странный - RIO.PAS теперь включает в себя новый блок PrivateHeap.pas. Удивляясь, почему, я googled и нашел аналогичную проблему с объяснением, которое, казалось, было правильным на цель.
DEP проблема в основном, что начиная с Windows XP с пакетом обновления 2 , если ваше оборудование способно, Windows, предотвратит выполнение кода из неисполнительную памяти. К сожалению, время работы Delphi SOAP создает кучу thunks, а выделенная для них память не была отмечена как исполняемая. Поэтому, когда обновление ОС было выпущено на аппаратном обеспечении , вы получите AV, когда , ссылаясь на метод, поддерживаемый компонентом RIO . Этот вопрос был рассмотрен в обновлении с помощью модуля PrivateHeap.
- Жан-Мари Babet
http://delphigroups.info/2/11/344230.html
Бинго! Теперь вот где это становится сложно. DEP всегда был включен на наших серверах. Так что сначала это казалось маловероятным. Но DEP сложна, и более новое оборудование более способно, чем более старое оборудование. Поэтому я думаю, что мы ушли с проблемами DEP в прошлом, и теперь новое оборудование отключает нас. Наш администратор сервера отключил защиту DEP (для сторонних приложений), перезагрузился и наш старый код работал! Хотя мы, в конечном счете, перейдем к более новым библиотекам, это будет отличным краткосрочным исправлением для нас, поскольку это позволяет нам избежать необходимости регрессионного тестирования этого приложения, которое отлично работает в противном случае.
Итак, подведем итог: наше приложение Delphi2005 рушилось на недавно построенных серверах Windows2003 из-за предотвращения выполнения данных (DEP), мешающих созданию объекта HTTPRIO. RIO будет создан без исключения, появился действительный.Но когда был использован связанный с ним объект IInvokable, он бы бросил нарушение прав доступа, прежде чем пытаться вообще связаться с проводкой. Престижность нашим кооперативным и очень терпеливым админам, коллегам-разработчикам Mcmar, Beyond Compare и Jean-Marie Babet.
Возможно, это был межсетевой экран, вызывающий проблемы в 2003 году?
Что вы подразумеваете под «приложение умирает»? Можете ли вы предоставить конкретные данные? Выдает ли ошибка? Может, может возникнуть исключение? –
Майк, пожалуйста, отредактируйте/пересмотрите вопрос, чтобы удалить Инди. Может быть, заголовок должен быть: «Приложение SOAP от Delphi2005 умирает при вызове HTTPRIO (SOLVED - DEP Issue)». –