Dynamic_Cast من كائن COM إلى واجهة COM لا يصطدم عدد المرجع، هل ذلك؟

StackOverflow https://stackoverflow.com/questions/1460795

سؤال

إذا كان لدي فئة C ++، X، التي تنفذ واجهات COM IY و IZ، ولدي مؤشر Y إلى واجهة IY كائن من النوع X، وأفعل ذلك:

IZ *z = dynamic_cast<IZ *> ( y );

لا تصطدم عدد مرجعي الكائن، هل يفعل ذلك؟ ليس علي القيام بالإصدار () لحسابها، أليس كذلك؟

إذا كان يهم، فأنا أستخدم ATL / COM.

أنا أظن الجواب هو "لا لا يضعح عدد المرجع، ولا تضطر إلى الإفراج ()"، لكنني أريد أن أتأكد.

شكرا مقدما.

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

المحلول

يتم زيادة عدد المراجع لكائنات COM عندما يستدعي شخص ما Iunknown :: AddRef (). QueryInterface ()، وفقا لقواعد COM لأنه يعطي مؤشر واجهة جديدة، يدعو داخليا AddRef ().

في الرمز المنشور، أنت لا تتصل addref ()، ولن تتصل بأي وظيفة قد تتصل addref ()، فلماذا تعتقد أنه سيتم زيادة عدد المرجعية؟

على الرغم من ما يفعله ATL / MFC في دماغه، لا يوجد سحر مشترك. عندما تكون في شك، يمكنك دائما عرض التفكيك في VS والخطوة من خلالها و إثبات لنفسك أن AddRef () لا يتم استدعاؤه.

تحرير: وأريد أن أكرر ما قاله Dewfy، لا تفعل هذا. وبعد استخدم QueryInterface (). أو cComqiptr <> (إذا كنت حقا يجب).

مزيد من التحرير: إذا كنت تستخدم ccomptr <> و ccomqiptr <>، فلن تضطر إلى الاتصال بالإصدار () والكثير من عبء معرفة العد الصحي السليم يتم تخفيفه. يجب أن تفكر حقا في استخدامها.

نصائح أخرى

يجب عدم استخدام Dynamic_Cast لأسباب متعددة:

  • أنت لا تعرف ما إذا كانت الوجهة تدعم RTTI
  • لست متأكدا مما إذا كانت OLE لا تخلق وكيلا لك
  • ...

بدلا من ذلك، استخدم QueryInterface - سيعقد ما تريد.

حتى لو كنت متأكدا من السؤال أعلاه - لا يتغير الصب refcounter

في C ++ باني، dynamic_cast على مؤشر واجهة com يفعل فعلا QueryInterface. وبعد ومؤشر عاد، إذا نجحت تشي، يحصل AddRef'د.

الطبقات التي تنفذ كائنات COM لها تخطيطات Vtable مختلفة لمزيد من فئات C ++ العام، لذلك نمط C ++ dynamic_cast لا يمكن أن تعمل؛ لذلك أفترض أن هذا هو السبب في منشئ C ++ هو الشيء الأكثر عقلانية للقيام QueryInterface.

(كانت الفكرة الأصلية من COM هي تعميم نموذج كائن C ++ لتكون لغة غير ملهية ولديها معيار ثنائي؛ تم إعادة تسميتها Dynamic_Cast إلى QueryInterface).

أعتقد أن الجواب العلوي يشير إلى MSVC، إذا تسبب Dynamic_cast سلوك غير محدد.

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