在QtWebkit的demobrowser中未检测到Npapi插件

时间:2012-07-13 12:33:53

标签: plugins npapi qtwebkit

我也是StackOverflow和QtWebkit的新手。

我编写了一个非常基本的Npapi插件,其中包含NP_GetMimeTypeDescriptionNp_Initialise等功能,用于Mimetype application/basic-plugin和Mimetype描述application/basic-plugin:bsc:Plug-ins SDK sample

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

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

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

1 个答案:

答案 0 :(得分:1)

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

有两个原因......

  1. 必须在编译期间将Define 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
    }
    
  2.     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 - &gt;浏览器首先调用初始化函数。 (在Linux的情况下,应该通过调用导出插件函数集 NP_GetEntryPoints explicity由于浏览器不会调用GetEntryPoints)

    2. NP_GetEntryPoints - &gt;从NP_Initialize for Linux中明确调用 公开/导出插件函数。

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

    4. NP_GetValue变量:2 - &gt;从浏览器调用来获取 插件描述(NPPVpluginDescriptionString)

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

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

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

    8. ...

    9. 请注意,将调用上述序列中的下一个函数 IF和ONLY如果上一个函数调用返回成功。: - )