سؤال

أواجه مشكلة في تطبيق Delphi على بعض خوادم Windows 2003. يستخدم مكالمة خدمة الويب للاتصال بخادم آخر ونقل البيانات ذهابًا وإيابًا. بمجرد وصول التطبيق إلى طريقة المصادقة ، يموت التطبيق. لقد عمل التطبيق لسنوات على الصناديق السابقة مع Win Server 2003 ، لكنه لا على الأجهزة التي تم بناؤها حديثًا. يتم إعداد الآلات بنفس الطريقة بالنسبة للجزء الأكبر ، ولكن من الواضح أن هناك بعض إعدادات التكوين التي تختلف من أنني غير قادر على تعقبها. أيضًا ، على الرغم من أن الخطأ يصبح واضحًا في المكالمة للمصادقة ، إلا أن Sniffing Packet يثبت أنه لا يوجد شيء يحدث بين التطبيق والخادم الذي يحاول الاتصال به ، مما يعزز أفكاري أن شيئًا ما يموت مبكرًا في إعداد الاتصال. لا يمكنني تكرار الخطأ محليًا ، لذلك لا يمكنني التنقل عبر التطبيق في مصحح أخطاء أيضًا. أي أفكار حول سبب فشل اتصال الويب Indy 9 Delphi بصمت؟

هل كانت مفيدة؟

المحلول

ها هو المكان الذي كان ينفجر فيه:

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

وجد الحل! اتضح أنه DEP (الوقاية من تنفيذ البيانات). عندما أعيد بناء الكود لدينا مع مكتبات SOAP DELPHI2007 ، ذهب التحقيق بعيدا. بما أنني لم أكن أرغب في القيام بذلك (تسبب إزالة التالي في مشاكل جعلت الخادم يختنق على XML) ، ولم يرغب MGR حقًا في القيام بذلك (تضمن اختبار الانحدار المكثف) ، بحثت عن اختلافات بين الصابون رمز المصدر بين D2005 و D2007 ، مع فكرة إجراء تغيير مستهدف على كل ما كان مختلفًا بين الاثنين. أي العثور على الفرق الذي يحدث فرقا. ما وراء المقارنة كان صديقي هنا. تميز نوع واحد من التغييرات باعتباره غريبًا - يتضمن Rio.PAS الآن وحدة جديدة PrivateHeap.Pas. أتساءل لماذا ، غوغل ووجدت مشكلة مماثلة مع تفسير بدا أنه على حق في الهدف.

ال DEP المشكلة هي في الأساس أنه بدءًا من Windows XP Service Pack 2 ، إذا كانت أجهزتك قادرة، ستمنع Windows تنفيذ التعليمات البرمجية من الذاكرة غير القابلة للتنفيذ. لسوء الحظ ، يخلق وقت تشغيل Soap Delphi مجموعة من thunks ولم يتم تنفيذ الذاكرة المخصصة لها. لذلك عندما تم إصدار تحديث نظام التشغيل على أجهزة قادرة ، ستحصل على AV عند استدعاء طريقة مدعومة بمكون ريو. تمت معالجة هذه المشكلة في تحديث مع وحدة PrivateHeap.
-جان ماري بابيت
http://delphigroups.info/2/11/344230.html

بنغو! الآن هنا حيث يصبح الأمر صعبًا. تم تمكين DEP دائمًا على خوادمنا. لذلك في البداية ، بدا هذا كما لو أنه لم يكن من المحتمل. لكن DEP صعب ، والأجهزة الأحدث أكثر قدرة من الأجهزة القديمة. لذلك أعتقد أننا خرجنا من مشكلات DEP في الماضي ، والآن الأحدث الأجهزة تعثر علينا. قام مسؤول الخادم الخاص بنا بتقلب حماية DEP (لتطبيقات الطرف الثالث) ، وإعادة التشغيل ، وعملت الكود القديم لدينا! على الرغم من أننا سننتقل في النهاية إلى المكتبات الأحدث ، إلا أن هذا سيكون حلًا كبيرًا على المدى القصير بالنسبة لنا لأنه يتيح لنا تجنب الاضطرار إلى اختبار هذا التطبيق الذي يعمل بشكل جيد.

لذلك لتلخيص: تم تعطل تطبيق Delphi2005 على خوادم Windows2003 التي تم إنشاؤها حديثًا بسبب الوقاية من تنفيذ البيانات (DEP) التي تتداخل مع إنشاء كائن HTTPrio. سيتم إنشاء ريو دون استثناء ، ويبدو ساري المفعول. ولكن عند استخدام الكائن المرتبط بـ iinvokable ، فإنه يرمي انتهاكًا للوصول ، قبل محاولة التواصل على السلك على الإطلاق. مجد لمشرفينا التعاونية والمريض للغاية ، زميله ديف ماكمار ، وراء المقارنة ، وجان ماري بابيت.

نصائح أخرى

هل يمكن أن يكون جدار الحماية الذي يسبب مشاكل في عام 2003؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top