0

我也是 StackOverflow 和 QtWebkit 的新手。

我编写了一个非常基本的 Npapi 插件,它具有MimetypeNP_GetMimeTypeDescription和Mimetype description之类的功能。Np_Initialiseapplication/basic-pluginapplication/basic-plugin:bsc:Plug-ins SDK sample

但是我在 QtWebKit 的演示浏览器和 Mozilla Firefox 上加载它时遇到了问题。我已将生成的 .so 文件放置在浏览器找到插件之类的/usr/lib/mozilla/plugins/路径和 Qt Lib 路径中。

我有一个包含 Mimetype 的 test.html 文件application/basic-plugin。我正在尝试在 Mozilla 浏览器和 QtWebKit 演示浏览器中启动这个插件但是在这两种情况下它都没有启动插件。

我无法找出原因。欢迎任何建议...

4

1 回答 1

1

感谢您的帮助和建议。
即使我将 .so 文件放在正确的文件夹 /usr/lib/mozilla/plugins/ 和 Qt Lib 路径中,我也能够找出为什么我的插件没有被调用的问题。

有2个原因...

  1. 必须在编译期间启用定义 XP_UNIX (-DXP_UNIX) 作为编译器指令。这将考虑功能的不同原型以及实现

    extern "C"
    NPError OSCALL NP_Initialize(NPNetscapeFuncs *browserFuncs
    #ifdef XP_UNIX
                              , NPPluginFuncs *pluginFuncs
    #endif
                              )
    {
            // keep a pointer to the browser functions
            g_browser = browserFuncs;
    
            // any memory that is to be shared by all instances of 
            the browser plugin should be initialized here.
            ;
    
    #ifdef XP_UNIX
           // under Linux, as the browser won't call NP_GetEntryPoints() 
            explicitly, do it now to fill in <pluginFuncs>
    
            return NP_GetEntryPoints(pluginFuncs);
    #else
    
            return NPERR_NO_ERROR;
    #endif
    }
    

    extern "C"
    #ifdef XP_UNIX
    NPError NP_GetValue(void* instance, NPPVariable variable, void *value)
    #else
    NPError NP_GetValue(NPP instance, NPPVariable variable, void *value)
    #endif

2.. 有 2 个函数 NP_GetValue 和 NPP_GetValue。

extern "C"
NPError NP_GetValue(void* instance, NPPVariable variable, void *value); 

NPError NPP_GetValue(NPP instance, NPPVariable variable, void *ret_value);

NPP_GetValue 是一个插件函数,其注册应在 NP_GetEntryPoints 中进行

    extern "C"
    NPError OSCALL NP_GetEntryPoints(NPPluginFuncs* NPPluginFuncsptr)
    {
            ......
            NPPluginFuncsptr->newp = NPP_New;
            NPPluginFuncsptr->getvalue = NPP_GetValue;
            NPPluginFuncsptr->setvalue = NPP_SetValue;
            return NPERR_NO_ERROR;
    }

在我的代码中,仅实现了 NP_GetValue 而未实现 NPP_GetValue。所以 NPP_GetValue 在 .so 中未定义,因此 .so 没有加载。

在实现函数 NPP_GetValue 时,该函数被定义并导出到 .so 文件中,并且能够成功加载它。

从浏览器到插件的函数调用顺序如下...

  1. NP_Initialize -> 浏览器首先调用初始化函数。(在 Linux 的情况下,应通过显式调用 NP_GetEntryPoints 导出插件函数集,因为浏览器不会调用 GetEntryPoints)

  2. NP_GetEntryPoints -> 从 NP_Initialize for Linux 显式调用以公开/导出插件函数。

  3. NP_GetValue 变量:1 -> 从浏览器调用以获取插件名称 (NPPVpluginNameString)

  4. NP_GetValue 变量:2 -> 从浏览器调用以获取插件描述 (NPPVpluginDescriptionString)

  5. NP_GetMimeDescription -> 从浏览器调用以获取 MimeType 描述(此函数应返回 Mime 类型描述,例如:return("application/basic-plugin:bsc:Plug-ins SDK sample");)

  6. NPP_New -> 从浏览器调用以创建插件实例。

  7. NPP_GetValue PLUGIN:main.cpp,NPP_GetValue,446ENTRY - > 从浏览器调用以获取插件特定数据...

  8. ……

请注意,如果且仅当前一个函数调用返回成功时,才会调用上述序列中的下一个函数。:-)

于 2012-07-18T06:25:10.213 回答