【问题标题】:Npapi Plugin not detected in demobrowser of QtWebkit在 QtWebkit 的演示浏览器中未检测到 Npapi 插件
【发布时间】:2012-07-13 12:33:53
【问题描述】:

我也是 StackOverflow 和 QtWebkit 的新手。

我编写了一个非常基本的 Npapi 插件,它具有 NP_GetMimeTypeDescriptionNp_Initialise 等 Mimetype application/basic-plugin 和 Mimetype 描述 application/basic-plugin:bsc:Plug-ins SDK sample 等功能。

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

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

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

【问题讨论】:

  • 它是否出现在 about:plugins 中?
  • 您好 它没有出现在 about:plugins 在 mozilla 中。我无法弄清楚为什么.....
  • 尝试在调试模式下加载firefox(firefox -g);你可能会在输出中看到一些有用的东西。当您进入 gdb 控制台时,只需键入 run
  • 我也是 gdb 的新手(很抱歉这样说).. 但是当我尝试运行命令时,它只是运行了 firefox 程序,并且在找不到插件时没有给出调试打印.. .
  • 如果您在应该加载插件时没有看到任何调试消息,那么我猜您没有将插件放在浏览器在您的系统上寻找它们的正确位置。

标签: plugins npapi qtwebkit


【解决方案1】:

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

有两个原因...

  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 示例");)

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

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

  8. ......

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2015-08-28
    • 2010-10-14
    相关资源
    最近更新 更多