قواعد عد مرجع

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

اضغط هنا لرابط المقالة باللغة الانجليزية104138
الموجز
في طراز كائن المكون يتم التحكم عمر الخاص بالواجهة من خلال حساب مرجع. يتم معالجة عدد مرجع لواجهة خلال دالتي عضو AddRef() و Release() موروثة من IUnknown. عضو AddRef() بزيادة عدد المرجع الخاص بالواجهة و decrements أسلوب Release() عليه. بمجرد الانتقال عدد المرجع الخاص بالواجهة إلى صفر ، لم يعد هناك أية مؤشرات صالح إلى تلك الواجهة. حالة حساب مرجع على كافة الواجهات كائن ما على صفر ثم الكائن يمكن تحرير لأنه لم يعد هناك أية مؤشرات إلى الكائن.
معلومات أخرى

قواعد عد مرجع

القائمة التالية هي عبارة عن نسخة المرجع عد القواعد (أخذ من صفحات 83 و 84 من مواصفات OLE 2.0) التي يجب أن يتبع. تمت إضافة نماذج الرموز الصغيرة في هذه المقالة لمساعدة في توضيح القواعد.

  1. يجب أن تكون كل نسخة جديدة من مؤشر واجهة AddRef 'd () و يجب أن يكون كل إتلاف مؤشر واجهة الإصدار لتنفيذها باستثناء () حيث القواعد التالية بشكل صريح تسمح خلاف ذلك.

    1. في الخارج المعلمات لوظائف: يجب الطالب AddRef() المعلمة الفعلي, لأنه سيكون الإصدار 'd () قبل قيام المستدعى عند تخزين out-value أعلى.
            LPOLEOBJECT lpObject;         .         .  // Get pointer to IOleObject.         .      LPVIEWOBJECT lpView = lpObject;      lpObject->AddRef()      // GetViewObject is a theoretical function that takes a      // pointer to anything derived from IUnknown, and then      // returns a pointer to IViewObject in the same variable      // passed as the parameter. The AddRef() above is needed so      // that the original pointer to IOleObject is not freed.      GetViewObject(lpView);								
    2. إحضار متغير عمومي: نسخة محلية مؤشر واجهة جلب من نسخة موجودة من المؤشر في متغير عمومي يجب بشكل مستقل قد مرجع حساب لأن تسمى دالات إتلاف النسخة في العمومية أثناء استمرار نشاط النسخة المحلية.
            void function()      {      // Get a pointer to IOleObject from a global variable.      LPOLEOBJECT lpOleObject = glpObject;      // This AddRef() is needed so that the interface      // pointed to by the global variable, glpObject,      // does not get released by a different part of      // the applications code.      lpOleObject->AddRef();         .         . // use lpOleObject;         .      lpOleObject->Release();      }								
    3. مؤشرات جديدة synthesized خارج "الهواء رفيع": دالة synthesizes مؤشر واجهة استخدام معرفة داخلية خاصة بدلاً من الحصول على من أي مصدر آخر عليك القيام AddRef() أولي على المؤشر المركب حديثاً. تتضمن أمثلة الهامة مثل إجراءات إجراءات إنشاء مثيل تطبيقات IUnknown::QueryInterface وما.
            STDMETHDOIMP IUnknown::QueryInteface( REFIID iidInterface,                                         LPVOID FAR *ppvObj)      {      *ppvObj = NULL;      SCODE sc = E_NOINTERFACE;      if (iidInterface == IUnknown)          {          *ppvObj = this;          // This AddRef() is needed because a new pointer          // was just created.          AddRef();         sc = S_OK;          }      return ResultFromScode(sc);      }								
    4. إرجاع نسخة مؤشر المخزنة داخليًا: بمجرد إرجاع المؤشر المستدعى لديه لم فكرة كيفية ارتباط به عمر إلى التي النسخة المخزنة داخليًا من المؤشر. وبالتالي، يجب قيام المستدعى AddRef() نسخ المؤشر قبل العودة إليه.
            // m_lpOleObject is a private member variable of a C++ class.      // GetOleObject is a member function to return access to this      // pointer.      void GetOleObject (LPVOID FAR *ppObject)      {          *ppObject = m_lpOleObject;          // This AddRef() is needed due to this rule.          m_lpOleObject->AddRef();       }								
  2. يمكن السماح معرفة خاصة من جانب قطعة من التعليمات البرمجية حول العلاقات beginnings و نهايات أعمار نسخ أو أكثر من مؤشر واجهة AddRef()/Release() أزواج يكون تم حذفها.

    1. في- معلمات الدوال: يحتوي النسخة من مؤشر واجهة الذي تم تمريره كمعلمة فعلي إلى دالة في عمر متداخلاً في التي المؤشر استخدامه لتهيئة القيمة. لذلك، المعلمة الفعلي تحتاج لا بشكل منفصل مرجع حساب.
            void function (LPOLEOBJECT lpOleObject)      {      // Can use lpOleObject in this function      // without doing AddRef() and Release().      }								
    2. معلمات إلغاء التسجيل من الدالات بما في ذلك قيم الإرجاع: لتعيين المعلمة يجب أن الدالة نفسها بواسطة قاعدة 1 وجود نسخة والاستقرار مؤشر واجهة. عند الإنهاء "، يتم نقل مسؤولاً عن تحرير المؤشر من المستدعى إلى المستدعي. وبالتالي، المعلمة تحتاج لا يمكن الإشارة إلى حساب.
            LPVIEWOBJECT lpView;      HERROR hErr = lpOleObject->QueryInterface(IID_IViewObject,                                                (LPVOID FAR *)lpView);      if (hErr = NOERROR)          {          // The QueryInterface succeeded. lpView does not have          // to be AddRef()'d because it has already been done          // by the QueryInterface method.          }								
    3. المتغيرات المحلية: تطبيق دالة بوضوح لديه معرفة omniscient الأعمار لكل من المتغيرات المؤشر المخصص في إطار المكدس. وبالتالي يمكن استخدامه هذا المعرفة بحذف أزواج AddRef()/Release() المكرر.
            void function()      {      LPOLEOBJECT lpTempObject;         .         .         .      lpTempObject = lpObject;         .         .  // lpTempObject can be used         .  // without reference counting as long as         .  // it is known that the lifetime of lpObject         .  // outside of this function call.         .      }								
    4. Backpointers: بنية البيانات بعض لطبيعة يحتوي على مكونين A وB ولكل مؤشر إلى آخر. إذا المعروف عمر مكون واحد (من) تحتوي على عمر أخرى (ب) ، ثم المؤشر من المكون الثاني مرة أخرى إلى الأول (من B إلى أ) تحتاج لا يكون المرجع حساب. غالباً ما تجنب دورة وإلا يتم إنشاء مهم في الاحتفاظ سلوك تحرير المناسبة.
2.00 3.50 4.00

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 104138 - آخر مراجعة: 12/03/2003 16:09:55 - المراجعة: 3.1

Microsoft OLE 2.0, Microsoft OLE 4.0

  • kbmt kbprogramming KB104138 KbMtar
تعليقات