سؤال

ملاحظة:

  • باستخدام الخام Win32 CreateTheard() API
  • لا MFC
  • واجهة هو مجرد مؤشر إلى vtable

السؤال:

  • كيفية تمرير مؤشر واجهة إلى الموضوع ؟

التوضيح:

IS8Simulation *pis8 = NULL;

...

CoCreateInstance(
                 clsid,
                 NULL,
                 CLSCTX_LOCAL_SERVER,
                 __uuidof(IS8Simulation),
                 (void **) &pis8);



...

hThread = CreateThread(
                NULL,
                0,
                SecondaryThread,
                //interface pointer pis8
                0,
                &dwGenericThreadID);

...

DWORD WINAPI SecondaryThread(LPVOID iValue)
{
    //using iValue accordingly
    //E.g.: iValue->Open

تحياتي

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

المحلول

كما هو مذكور أدناه ، تمرير COM مؤشر واجهة بين المواضيع في غير آمنة.

أفترض أنك تعرف ما تقومون به:

hThread = CreateThread(
                NULL,
                        0,
                        SecondaryThread,
                        (LPVOID) pis8
                        0,
                        &dwGenericThreadID);

DWORD WINAPI SecondaryThread(LPVOID iValue)
{
   ((IS8Simulation*) iValue)->Open();
}

موضوع آمنة الإصدار:

void MainThread()
{
    IStream* psis8;
    HRESULT res = CoMarshalInterThreadInterfaceInStream (IID_IS8SIMULATION, pis8, &psis8);
    if (FAILED(res))
         return;
    hThread = CreateThread(
                NULL,
                0,
                SecondaryThread,
                (LPVOID) psis8
                0,
                &dwGenericThreadID
          );
}

DWORD WINAPI SecondaryThread(LPVOID iValue)
{
   IS8Simulation* pis8;
   HRESULT res = CoGetInterfaceAndReleaseStream((IStream*) iValue, IID_IS8SIMULATION, &pis8);
   if (FAILED(res))
      return (DWORD) res;
   pis8->Open();
}

نصائح أخرى

إذا واجهة في سؤالك هو واجهة COM النهج قدمها Quassnoi قد لا يكون كافيا.لديك لدفع الانتباه إلى مؤشر الترابط-نموذج كائن COM في الاستخدام.إذا الثانوية موضوع الانضمام منفصل COM شقة من أن كائن COM تم إنشاؤه في, و إذا كان هذا الكائن لا شقة-رشيقة, سوف تحتاج إلى المشير أن مؤشر واجهة بحيث الثانوية الخيط يحصل الوكيل و لا مؤشر مباشرة إلى الكائن.

كائن COM عادة مصنوعة شقة-رشيقة باستخدام خاص تنفيذ IMarshal.أبسط النهج الكلي الحرة مترابطة منظم.

بعض الروابط المفيدة...

تحديث:عن منظم ترابط حرة...

من الواضح من التعليقات على هذا الموضوع أن بعض الناس سوف ننصح أبدا لمس FTM.في حين أن "فعالية COM" هو كتاب ممتاز, أعتقد أن بعض توصياتها مفتوحة للتفسير.البند 33 يقول: "حذار FTM";فإنه لا يقول "لا تستخدم FTM".بحكمة بالغة فإنه ينصح الحذر بشكل خاص عند شقتك-رشيقة كائن يحمل إشارات إلى أشياء أخرى ، لأنها قد لا تكون شقة-رشيقة.لذا النصيحة هي:التفكير بعناية عند بناء شقة-رشيقة الكائنات ، سواء كانت أو لم تكن استخدام FTM لتحقيق خفة الحركة.إذا كنت متأكدا من أنك يمكن بناء شقة-رشيقة كائن لا أرى أي سبب لماذا لا تستخدم FTM لتحقيق ذلك.

كنت في الأساس تحتاج إلى القيام بما يلي:

  • CoMashalInterThreadInterfaceInStream ==> يمكنك الحصول على واجهة IStream.
  • تمرير هذا IStream إلى الموضوع ، على سبيل المثالكما Quassnoi قال.
  • في SecondaryThread اتصل CoGetInterfaceAndReleaseStream للحصول على واجهة (أو وكيل لذلك ، إذا لزم الأمر).

لا إطلاق واجهة IStream إلا إذا خلق الموضوع فشل و لا خروج الخيط حتى يو ودعا CoGetInterfaceAndReleaseStream.

وقت التشغيل COM خلق الوكيل بالنسبة لك تلقائيا.الوكيل يضمن مثلاشقة ترابط مكون COM يطلق على الخيط الذي قام بإنشائه.ولكن هذا يتطلب أيضا أن:

  • واجهة IDispatch ، أو وكيل/كعب مكونات مسجلة واجهة
  • على threadthat خلق عنصر لديه رسالة حلقة والعمليات الرسائل
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top