كيفية الحصول على مثيل NPP داخل البرنامج المساعد NPAPI C

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

  •  09-09-2019
  •  | 
  •  

سؤال

لقد كتبت البرنامج المساعد NPAPI في C الذي يحتاج إلى الاتصال npn_invoke. وظيفة (من أجل استدعاء وظيفة جافا سكريبت).

لكن npn_invoke () يأخذ NPP. مثيل معلمة.

تحصل فقط على وظائف NP_NEW () و NP_DESTROY () مثيل NPP. كيف يمكنني الحصول على هذا مثيل NPP هذا؟

شكرا مقدما.

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

المحلول

في np_getentrypoints تحديد دالة NP_Yournew الخاصة بك، الآن عند استدعاء الإطار بعد np_new بعد np_yournew بالمثيل. يمكن حفظ المثيل عند استدعاء اتصالك للتو.

نصائح أخرى

أفضل طريقة هي في الواقع تمديد NPOBJECT مع حقل لحفظ مثيل NPP المرتبط، وتوفير وظائف تخصيص / إلغاء تخصيص مع تعريف NPClass الخاص بك. يمكنك بعد ذلك إلقاء NPOBJECT إلى الفرعية الفرعية للوصول إلى مثيل NPP الفعلي.

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

كمثال، افتراض C ++، سترغب في تمديد NPOBJECT:

struct MyNPObject : public NPObject {
  NPP npp_;
  explicit MyNPObject(NPP npp) : npp_(npp) {}
};

ثم سيحتاج تعريف NPClass الخاص بك إلى تخصيص وتعريفات التعريفات:

static NPClass obj_Class = {
  NP_CLASS_STRUCT_VERSION,
  &obj_allocate,
  &obj_deallocate,
  NULL,
  &obj_hasMethod,
  &obj_invoke,
  ...

والتي يمكن تنفيذها مثل ذلك:

static NPObject* obj_allocate(NPP npp, NPClass *aClass)
{
  return new MyNPObject(npp);
}

static void obj_deallocate(NPObject *obj)
{
  delete obj;
}

وعندما تحتاج إلى الاتصال NP_INVOUKE، افترض أن لديك NPOBJECT * (داخل obj_invoke، على سبيل المثال) أنت فقط Downcast:

MyNPObject* myObj = reinterpret_cast<MyNPObject*>(obj);
g_browser->invoke(myObj->npp, ...)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top