سؤال

أولاً ، أنا جديد جدًا في Delphi و Com ، لكن يجب أن أقوم ببناء تطبيق com في Delphi. قرأت الكثير من المقالات والملاحظات على internets ، لكن Com و Com في Delphi لا يزالون غير واضحين بالنسبة لي.

مصادري - http://www.everfall.com/paste/id.php؟wisdn8hyhzkt (حوالي 80 سطر).

أحاول إنشاء واجهة COM وفئة التداخل - إنه يعمل إذا اتصلت طريقة واجهة من Delphi (أقوم بإنشاء كائن ضمني عبر testclient.create) ، ولكن إذا حاولت إنشاء كائن من العالم الخارجي (من Java ، عبر COM4J ) تحطمت طلبي مع استثناء التالي:

Project Kernel.exe raised exception class $C0000005 with 
message 'access violation at 0x00000002: read of address 0x00000002'.

إذا قمت بتعيين نقطة توقف في QueryInterface - فهي تنكسر ، ولكن عندما أخرج من الوظيفة - كل تعطل.

ماذا أفعل خطأ؟ ما الذي ما زلت أفتقده؟ ما يمكنني/يجب أن أقرأه عن com (في دلفي) لتجنب أسئلة غبية مثل هذه؟

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

المحلول 3

لقد صنعت DLL مع com من الصفر و

  1. أستخدم DllRegisterServer - لقد منحني إمكانية للتحكم في تسجيل الخادم (عبر tcomobjectfactory.registerClassObject في محاولتي الأولى)
  2. أقوم بإزالة QueryInterface من TestComimpl
  3. يدعم COM4J نموذج الخيوط STA (الشقة) فقط (أفترض أن registerClassObject يستخدم MTA)
  4. لذلك إذا تم تسجيل الفئة كشقة (STA) أو كليهما - يمكن لـ COM4J إنشاء مثيلات.

شكرا للجميع للمساعدة!

نصائح أخرى

ليست هناك حاجة لتنفيذ iunkown.queryInterface نفسك. قم بإزالة هذه الطريقة من TestComimpl ودع tcomobject تتعامل معها. تأكد أيضًا من إعطاء واجهة ITESTCOM GUID.

إذا كان الحادث يحدث بعد عودة QueryInterface ، فإن ما سأفعله هو وضع نقطة توقف في تطبيق Java عندما يستدعي QueryInterface ومعرفة ما يحاول القيام به بعد ذلك. هذا سوف يعطيك فكرة عن مكان النظر.

يبدو أن تعليقك يتحمل هذا. إنها تدعو QueryInterface ، واستعادة نتيجة تقول أن هذه الواجهة جيدة ، ومحاولة استخدامها لشيء ينهار على الفور. ولكن إذا قمت بتعليق الكود الذي يخبره بأن الواجهة جيدة ، فهذا ينتهي بمحاولة استخدام الواجهة ، ولا شيء ينفصل.

إذا لم تكن على دراية بـ Delphi ، فإن انتهاك الوصول يعني عادةً إشراف مؤشر فارغ. هنا ، يقول أن مؤشر التعليمات الخاص بك في موقع الذاكرة 0x000002. ربما يعني ذلك أنك حاولت بطريقة ما استدعاء طريقة افتراضية (أو طريقة واجهة) على كائن لم يتم بناؤه بعد.

امل ان يساعد!

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