感谢您的帮助和建议。
我能够找出为什么我的插件没有被调用的问题,
即使我将 .so 文件放在正确的文件夹中
/usr/lib/mozilla/plugins/ 和 Qt Lib 路径。
有两个原因...
-
在编译期间必须启用定义 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 文件中,并且能够成功加载。
从浏览器到插件的函数调用顺序如下...
NP_Initialize -> 浏览器首先调用初始化函数。
(在 Linux 的情况下,插件函数集应该通过调用导出
NP_GetEntryPoints 显式因为浏览器不会调用 GetEntryPoints)
NP_GetEntryPoints -> 从 NP_Initialize for Linux 显式调用
公开/导出插件功能。
NP_GetValue 变量:1 -> 从浏览器调用以获取插件名称
(NPPVpluginNameString)
NP_GetValue 变量:2 -> 从浏览器调用以获取
插件描述(NPPVpluginDescriptionString)
NP_GetMimeDescription -> 从浏览器调用以获取 MimeType 描述
(此函数应返回 Mime 类型描述
例如:
return("application/basic-plugin:bsc:Plug-ins SDK 示例");)
NPP_New -> 从浏览器调用以创建插件实例。
NPP_GetValue PLUGIN:main.cpp,NPP_GetValue,446ENTRY -> 从浏览器调用以获取插件特定数据...
......
请注意,上述序列中的下一个函数将被调用
IF 且仅当前一个函数调用返回成功时。:-)