2012-07-25 72 views
1

我有这个getValue方法+ NPclass方法:为什么我的简单测试NPObject不起作用?

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); 
} 

在我的javascript:

 <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; 

对象在我NPP_New方法我有

PluginInstance *newInstance = (PluginInstance*)malloc(sizeof(PluginInstance)); 
bzero(newInstance, sizeof(PluginInstance)); 
newInstance -> object = NPN_CreateObject(instance, &class); 
newInstance->npp = instance; 
instance->pdata = newInstance; 

在我getValue方法:

NPObject* obj = ((PluginInstance *) (instance->pdata)) -> object; 
    void **v = (void **)value; 
    NPN_RetainObject(obj); 
    *v = obj; 

还是同样的问题

回答

1

您不仅应该填写部分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; 
} 
+0

我添加到所有NPclass指针的存根方法除了构建体和予设定值到NPObject仅在NPPVpluginScriptableObject情况。现在插件现在崩溃了,而没有做任何事情。谢谢你的帮助。我认为崩溃比没有做任何事情更好,因为这意味着它做了一些事情。还有其他建议吗?我用我的更改更新了上面的代码。我会在每个实例后创建对象..现在我只想看看测试工作。 – PendingVegan 2012-07-26 19:22:22

+0

@John:从'allocate()'调用'browser-> createObject()'导致浏览器再次调用你的'allocate()'函数,所以你当前可能会得到无限递归。您需要在分配时创建'NPOject',请参阅[Mozillas测试插件](http://mxr.mozilla.org/mozilla-central/source/dom/plugins/test/testplugin/nptest。CPP#1888)。顺便说一下,请将更新添加到您的问题中,而不是将其更改为整体,否则现有答案突然不再适合该问题。 – 2012-07-26 21:11:57

+0

@Georg_Fritzsche这是一个好主意。很抱歉没有使用更新,我一定会从现在开始做。我基于mozilla示例代码展示了我的新分配函数(谢谢你!)。但是,仍然没有改变。我将使getValue实例具体化以查看是否会改变任何内容,但我不乐观。你有没有看到其他的错误?如果这些信息有帮助,如果我在javascript中调用plugin.something,插件只会崩溃,否则它会创建窗口。 – PendingVegan 2012-07-26 21:20:38

相关问题