لماذا لا يعمل كائن الاختبار البسيط الخاص بي?
-
11-12-2019 - |
سؤال
لدي هذه الطريقة جيتفالو + أساليب نيكلاس:
static bool hasmethod(NPObject *npobj, NPIdentifier name)
{
return true;
}
static NPObject* allocate (NPP npp, NPClass *aClass)
{
return browser-> createobject(npp, aClass);
}
static bool hasProperty(NPObject *npobj, NPIdentifier name)
{
return true;
}
static bool getProperty (NPObject *npobj, NPIdentifier name, NPVariant *result)
{
if (!result)
return false;
INT32_TO_NPVARIANT(50, *result);
return true;
}
static void deallocate (NPObject *npobj)
{
browser -> memfree(npobj);
}
static bool enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count)
{
return false;
}
static bool defaultInvoke(NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result)
{
if (!result)
return false;
INT32_TO_NPVARIANT(42, *result);
return true;
}
static bool setProperty (NPObject *npobj, NPIdentifier name, const NPVariant *value)
{
return false;
}
static void invalidate(NPObject *npobj)
{
}
static bool removeProperty (NPObject *npobj,NPIdentifier name)
{
return false;
}
NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value)
{
if (! instance)
{
return NPERR_INVALID_INSTANCE_ERROR;
}
struct NPClass class;
class.structVersion = NP_CLASS_STRUCT_VERSION;
class.construct = NULL;
class.deallocate = deallocate;
class.hasMethod = hasmethod;
class.getProperty= getProperty;
class.enumerate= enumerate;
class.removeProperty= removeProperty;
class.hasProperty = hasProperty;
class.invoke = pinvoke;
class.invokeDefault = defaultInvoke;
class.invalidate = invalidate;
class.setProperty = setProperty;
class.allocate = allocate;
if (variable == NPPVpluginScriptableNPObject)
{
void **v = (void **)value;
struct NPObject *object = NPN_CreateObject(instance, &class);
NPN_RetainObject(object);
*v = object;
return NPERR_NO_ERROR;
}
return NPERR_GENERIC_ERROR;
}
وهنا اثنين من الطرق الأخرى يشير إلى فئة:
bool hasmethod(NPObject *npobj, NPIdentifier name)
{
return true;
}
static bool pinvoke(NPObject* obj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result)
{
if (!result)
return false;
INT32_TO_NPVARIANT(32, *result);
return true;
}
في الأساس ، أردت أن يعود الكائن 32 عندما تم استدعاء أي شيء فقط للاختبار.
وهنا بلدي إنشاء والاحتفاظ الأساليب:
NPObject *NPN_CreateObject(NPP npp, NPClass *aClass)
{
return browser->createobject(npp, aClass);
}
NPObject *NPN_RetainObject(NPObject *npobj)
{
return browser->retainobject(npobj);
}
في بلدي جافا سكريبت:
<embed type="application/x-my-extension" id="pluginId">
<script>
var plugin = document.getElementById("pluginId");
console.log(plugin.something);
يتم رسم النافذة على الصفحة ، لكن مخرجات وحدة التحكم غير محددة.مساعدة سيكون موضع تقدير كبير.شكراً!
تحديث:اقترح جورج أن المتصفح كان يتعطل بسبب العودية اللانهائية مع طريقة التخصيص الخاصة بي.هنا هو واحد جديد:
void* NPN_MemAlloc(uint32_t size)
{
return browser->memalloc(size);
}
static NPObject* allocate (NPP npp, NPClass *aClass)
{
NPObject* object = (NPObject*)NPN_MemAlloc(sizeof(NPObject));
if (!object)
{
return NULL;
}
memset(object, 0, sizeof(NPObject));
return object;
}
البرنامج المساعد لا يزال يتعطل.
تحديث 2:لقد جعلت مثيل الكائن محددا
typedef struct PluginInstance {
NPP npp;
NPWindow window;
NPObject *object;
}PluginInstance;
في بلدي نب _ طريقة جديدة لدي
PluginInstance *newInstance = (PluginInstance*)malloc(sizeof(PluginInstance));
bzero(newInstance, sizeof(PluginInstance));
newInstance -> object = NPN_CreateObject(instance, &class);
newInstance->npp = instance;
instance->pdata = newInstance;
في طريقة جيتفالو بلدي:
NPObject* obj = ((PluginInstance *) (instance->pdata)) -> object;
void **v = (void **)value;
NPN_RetainObject(obj);
*v = obj;
لا تزال نفس المشكلة
المحلول
لا يجب عليك فقط ملء أجزاء من NPClass
وظائف ، وعلى الأخص كنت في عداد المفقودين hasProperty
& getProperty
.قد تتعامل المتصفحات مع وظائف أخرى مفقودة،ولكن بقدر ما أعرف أنها غير مطلوبة.
لاحظ أيضا أن لديك NPP_GetValue()
يجب فقط إرجاع الكائن النصي لـ variable == NPPVpluginScriptableNPObject
.
يجب عليك بعد ذلك إنشاء كائنات قابلة للنص لكل مثيل مكون إضافي (ضع في اعتبارك أنه يمكن تشغيل مثيلات متعددة من المكون الإضافي بشكل متزامن) ولا تنسى ذلك NPN_Release()
الكائن النصي عندما يذهب البرنامج المساعد الخاص بك بعيدا.
pinvoke()
يمكن تحسينها إلى:
static bool pinvoke(NPObject* obj, NPIdentifier methodName, const NPVariant *args,
uint32_t argCount, NPVariant *result)
{
if (!result)
return false;
INT32_TO_NPVARIANT(32, *result);
return true;
}