سؤال

مهمة:

يقبل التطبيق المكتوبة في دلفي هيكل (record من حيث دلفي) من ثلاثة مجالات. يمكنني إرسال مؤشر هذا الهيكل باستخدام SendMessage (Win32 API) وظيفة.

لذلك سؤال هو:

كيفية الحفاظ على تمثيل بنية معينة في الذاكرة ل Delphi من حيث دلفي؟

لديها نوع

PWPModPostData = ^ TWPModPostData;
TWPModPostData = record
   DataType: Integer;
   Data: PChar;
   Next: PWPModPostData;
end;

كيفية تحديد ذلك في ج؟ أعني، هل هناك أي حقول مخفية أو خدمة في هياكل دلفي؟

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

المحلول

لا، لا توجد حقول خفية، ويمكن تعيين سجلات Delphi ولولت C لبعضها البعض 1: 1، مع عدد قليل من التحذيرات:

  • لا تستخدم أي نوع بيانات C لا يفهم. يتضمن ذلك كائنات، صفائف ديناميكية، سلاسل دلفي.

  • C و Delphi أحيانا لديه أفكار مختلفة حول كيفية محاذاة البايت. اختبار السجلات الخاصة بك والتحقق من أنها تعمل على الجانب C. إذا لم يفعلوا ذلك، فحاول استخدام سجل معبأةبدلاً من سجل.

  • عند تمرير مؤشر إلى سجل من C إلى Delphi أو العكس، تأكد من أن الجانب الذي يتلقى أنه لا يحاول تحرير الذاكرة أو إعادة تخصيصها. ينتمي إلى مدير الذاكرة التي أنشأتها.

نصائح أخرى

لاحظ أنه على الرغم من أنه يمكنك بالتأكيد إرسال عنوان مثل هذا الهيكل إلى تطبيق آخر ك LPARAM من أ SendMessage() ندعو ذلك سوف يعمل على الأرجح. السبب هو أن المؤشر نفسه عادة ما لا يشير إلى نفس موقع الذاكرة الفعلية عند استخدامه في تطبيق آخر مع نطاق العنوان الخاص به.

إنه يعمل لبضع رسائل Windows مثل WM_GETTEXT, وفي هذه الحالات، يقوم نظام التشغيل بالتعيين الضروري وراء الستار، بحيث يمكن تطبيق الاستقبال نسخ البيانات إلى المخزن المؤقت المخصص من خلال تطبيق الاتصال، ونقاط العنوان نفس الجزء نفسه من الذاكرة الفعلية في كل من التطبيقين.

يمكن تحقيق نفس الشيء باستخدام WM_COPYDATA رسالة، التي تهدف إلى القيام بمهام الذاكرة اللازمة عند القيام بتبادل البيانات بين تطبيقين.

لكن الهيكل في سؤالك لديه مشكلة أخرى، لأنه يحتوي على مؤشرات إلى الذاكرة. ال WM_COPYDATA تنص الوثائق صراحة على أنه يجب ألا يتم ذلك. في حين أن عنوان كتلة الذاكرة بأكمله سيتم تعديله ليكون صالحا في تطبيق الاستقبال، لا يمكن للنظام معرفة أجزاء من كتلة الذاكرة هي المؤشرات وستحتاج إلى تعيينها أيضا. وبالتالي، سيتم ترك جميع المؤشرات المرتبطة كما هي ولا تكون غير صالحة. سيتم كسر قائمة الخاص بك منفردة، و PChar العناصر لن تكون متاحة أيضا.

تعديل:

فيما يتعلق بتعليقاتك: النقاط المذكورة أعلاه مهمة فقط إذا حاولت إرسال رسائل من التطبيقات الأخرى؛ إذا قمت بذلك من DLL، فستعمل أشياء DLL، لأن DLL يشارك مساحة عنوان العملية التي تم تحميلها فيها، لذلك ستظهر مؤشر يستخدم في التطبيق أو أي DLL تحميل دائما إلى موقع الذاكرة نفسه. آسف لأي ارتباك قد يحدث هذا، لكن لم يكن واضحا بالنسبة لي من سؤالك أن تبادل البيانات يحدث داخل تطبيق واحد.

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