نظرًا لاحتياجات المشروع ، استخدمت Delphi لكتابة DLL تقوم بتوصيل قاعدة البيانات بتصدير البيانات إلى ملف SQL ، والذي يستخدم مكون Tadoquery.
لا يوجد سوى طريقة تصدير واحدة:
دالة DataExport (المسار ، ini_path: pCHAR): integer ؛
بعد الكتابة ، كتبت test.exe مع Delphi للاختبار ووجدت أنه يمكن استخدامه بشكل طبيعي.
ثم سلم DLL إلى زميله وطلب منه الاتصال به في Powerbuilder. بعد أخذها ، وجد زميلي أنه بمجرد استدعاء DataExportPB ، يتم الإبلاغ عن أنه لا يمكن فتح DLL الهدف. أعتقد أن ذلك قد يكون لأن البيئات التي تعمل على كلا الجانبين مختلفة ، لذلك قمت بنسخ test.exe وجربته. الغريب ، test.exe يعمل بشكل جيد.
من أجل تحديد مكان حدوث المشكلة بالفعل ، استخدمت Python و C# لاختبارها مرة أخرى.
لا يسمى coinitialize ()
بعد مراجعة المعلومات ، وجدت أنه إذا تم استخدام مكون ADO في DLL من Delphi ، فيجب استدعاء طريقة Coinitialize لـ ActiveX قبل الاستخدام. بعد معرفة المشكلة ، يصبح الأمر أسهل بكثير.
اعتقدت أن PowerBuilder يجب أن يكون على ما يرام ، لكن من كان يعلم أنها ستكون نفس المشكلة. لا يمكنني معرفة ذلك الآن. تستخدم وحدة Ctypes في Python طريقة الاتصال في C وينبغي أن تكون طريقة تمرير المعلمة هي نفسها مثل PowerBuilder ، ولكن لماذا لا يزال غير ممكن في PB؟ طلب مني زميلي كتابة طريقة إخراج إضافية في DLL لتجربتها.
اختبار الوظيفة: PCHAR ؛
يبدأ
النتيجة: = "سلسلة الاختبار من الاختبار" ؛
نهاية؛
تم استدعاء طريقة الاختبار بنجاح في PB ، ثم حاول الزميل الاتصال بـ DataExport مرة أخرى ، وكان ناجحًا! ! ؟ ؟ لماذا؟ طريقة الاختبار هذه فقط تخرج سلسلة ثابتة. أنا في حيرة حقًا.
ولكن حدثت مشكلة أخرى في هذا الوقت.
لقد راجعت رمز Delphi بعناية واكتشفت باستخدام الرقم ما إذا لم يتم إصداره.
دالة DataExport (المسار ، ini_path: pCHAR): integer ؛
var
الاستعلام: Tadoquery.
يبدأ
.........
coinitialize () ؛
الاستعلام: = tadoquery.create (لا شيء) ؛
.........
Query.Close ؛
Query.free ؛
couninitialize () ؛
.........
نهاية؛
لا حرج! في اليأس ، قمت بتقسيم coinitialize () و couninitialize () إلى طريقتين مستقلتين.
وظيفة init: عدد صحيح ؛
يبدأ
يحاول
coinitialize () ؛
النتيجة: = 1 ؛
يستثني
باستثناء:
النتيجة: = 0 ؛
نهاية؛
نهاية؛
وظيفة غير ملائمة: عدد صحيح ؛
يبدأ
يحاول
couninitialize () ؛
النتيجة: = 1 ؛
يستثني
باستثناء:
النتيجة: = 0 ؛
نهاية؛
نهاية؛
ثم دع الزميل يدعو أولاً في حدث تهيئة النموذج ، ثم أغلق الحدث للاتصال بـ Uninit. تم حل المشكلة. كل شيء طبيعي.
على الرغم من أن المشكلة قد تم حلها ، إلا أنني ما زلت لا أفهم سبب قيامي بذلك.