كيف يمكنني ربط النصية البرنامج المساعد موزيلا سبيل المثال مع NObject?

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

  •  02-07-2019
  •  | 
  •  

سؤال

أنا الوقوع في مشكلة بربط أحد يحتج الأسلوب في البرنامج المساعد أكتب المناسب المساعد على سبيل المثال.الوثائق في http://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Scripting_plugins لا تعطي ما يكفي من المعلومات أن تكون مفيدة حقا في هذا.

باختصار أنا أحاول أن أفهم فقط التي النصية كائن المساعد ومن المتوقع أن يعود في استجابة دعوة إلى NPP_GetValue مع متغير حجة يساوي NPPpluginScriptableNPObject.أظن أنه ينبغي أن يكون هناك NPObject سبيل المثال لكل مثيل من البرنامج المساعد, ولكن كيف هي طريقة استدعاء() في NPClass من المفترض أن العثور على البرنامج المساعد سبيل المثال (NPP) من النصية NPObject انها تعطى الحجة ؟ أعتقد أن تنفيذ جدول البحث أن تفعل ذلك, ولكن لدي شعور ان هناك شيء واضح أنا في عداد المفقودين.

أنا تخزين مؤشر مثيل من فئة C++ (على سبيل المثال تنفذ وظيفة البرنامج المساعد) في pdata عضو الحزب الوطني الجديد ، في NPP_New().

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

المحلول

أعتقد أنني الإجابة على سؤالي...

الحل وجدت (وأود أن نقدر ما زالت تعليقات على صحتها ، وخاصة إذا كنت تعتقد أن هناك طريقة أفضل للقيام بذلك) تم تخصيص NPObject مشتقة هيكل التي لديها مؤشر إلى تنفيذ الدرجة في تخصص (وظيفة) لقد فضح فايرفوكس من بلدي المساعد.ثم تخزين مؤشر إلى أن NPObject في NPP هو pdata عضو في NPP_New().

في الاحتجاج () ، يلقي NPObject مؤشر أحصل على المستمدة الهيكل أعضاء إضافيين, حتى أنه يمكن الحصول على مؤشر إلى مثيل من فئة التنفيذ.

أنه بقدر ما أستطيع أن أقول هو القصد من التصميم NPObject الكائنات حالات NPClass ويشيرون إلى أنهم تنفيذ الأساليب والخصائص من خلال NPClass مؤشرات الدالة التي تتعامل مع هذه الكيانات ، أي البيانات الخاصة ومن المتوقع أن يتم تخصيص deallocated قبل تنفيذ و تنسيق غير محدد.

سوف ننظر بشيء من هذا القبيل:

 static NPClass refObject = {
    NP_CLASS_STRUCT_VERSION,
    My_Allocate,
    My_Deallocate,
    NULL,
    My_HasMethod,
    My_Invoke,
    My_InvokeDefault,
    My_HasProperty,
    My_GetProperty,
    NULL,
    NULL,
};

class MyImplClass {
    // Implementation goes here
};

struct MyNPObject : public NPObject {
    MyImplClass *my_impl_instance;
};

// This is just a bit of memory management - Mozilla wants us to allocate our own memory:
NPObject *My_Allocate(NPP inst, NPClass *)
{
    // We initialize the structure in NPP_New() below
    return (NPObject *)malloc(sizeof(MyNPObject));
}

NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
             char* argn[], char* argv[], NPSavedData* saved )
{
    NPObject *scriptable_object = npnfuncs->createobject(instance, &refObject);
    npnfuncs->retainobject(scriptable_object);
    MyImplClass *new_player = new MyImplClass(); 

    instance->pdata = scriptable_object;
    ((MyNPObject*)instance->pdata)->my_impl_instance = new_player;
    return NPERR_NO_ERROR;

}

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