2012-07-13 90 views
0

我也是StackOverflow和QtWebkit的新手。在QtWebkit的demobrowser中没有检测到Npapi插件

我写它有像NP_GetMimeTypeDescription和功能Np_Initialise等,为MIMETYPE application/basic-plugin和MIME类型描述application/basic-plugin:bsc:Plug-ins SDK sample一个非常基本的NPAPI插件。

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

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

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

+1

它显示在about:plugins? – taxilian 2012-07-13 23:02:35

+0

嗨它不显示在about:插件在Mozilla中。我无法弄清楚为什么..... – Techtotie 2012-07-16 05:09:16

+0

尝试在调试模式下加载firefox(firefox -g);你可能会在输出中看到一些有用的东西。当你到达gdb控制台时,只需键入run – taxilian 2012-07-16 06:41:05

回答

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 - >浏览器首先调用初始化函数。>从NP_Initialize为Linux明确提出到 暴露/导出插件功能 -

  2. NP_GetEntryPoints(在Linux中的情况下,一套插件功能应通过调用 NP_GetEntryPoints明确地作为浏览器不会叫GetEntryPoints出口)。

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

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

  5. NP_GetMimeDescription - >从浏览器中调用以获得MimeType描述 (该函数应该返回Mime类型描述 例如: 返回(“application/basic-plugin:bsc:Plug-in SDK sample”);)

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

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

  8. ......

请注意以上顺序中的下一个函数将被称为 IF和ONLY如果前一个函数调用返回成功。:-)