NPAPI 插件未在 Firefox 中加载
Posted
技术标签:
【中文标题】NPAPI 插件未在 Firefox 中加载【英文标题】:NPAPI plugin does not get loaded in Firefox 【发布时间】:2012-12-13 12:28:32 【问题描述】:我正在编写一个插件,它会进入 Windows 上 pluginreg.dat
文件中的 [INVALID]
部分。我认为我的npplugin.rc
文件有问题。
在npplugin.def
文件中一切都是正确的:
LIBRARY
EXPORTS
NP_GetEntryPoints @1
NP_Initialize @2
NP_Shutdown @3
但是NP_GetEntryPoints
和NP_Initialize
都没有被调用。
为了安装插件,我把它放到%APPDATA%/Mozilla/plugins
目录中。
这里是npplugin.rc
代码:
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
#if 0
/////////////////////////////////////////////////////////////////////////////
// Russian (Russia) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // Russian (Russia) resources
/////////////////////////////////////////////////////////////////////////////
#endif
/////////////////////////////////////////////////////////////////////////////
// English (United States) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 4,5
PRODUCTVERSION 4,5
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "MyCompany Ltd."
VALUE "FileExtents", "myext"
VALUE "FileOpenName", "My File"
VALUE "FileDescription", "NPPlugin for me"
VALUE "FileVersion", "4.5"
VALUE "InternalName", "npMyPlugin"
VALUE "Language", "English (United States)"
VALUE "LegalCopyright", "Copyright (C) MyCompany Ltd. 2012"
VALUE "MIMEType", "application/x-myplugin"
VALUE "OriginalFilename", "npMyPlugin.dll"
VALUE "ProductName", "My NPPlugin"
VALUE "ProductVersion", "4.5"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
我的问题是哪里出错或缺少什么?
【问题讨论】:
【参考方案1】:我是来自conedogers 的 Chris,很高兴看到您发现我的博客很有用。
乔治是正确的。 Firefox 不是在寻找 Windows 语言环境。看起来 Mozilla 有自己的国际化,这是有道理的,因为他们的代码是为多个平台编写的。
这里发生的是块“040904e4”告诉二进制如何处理下面包含的字符串。版本信息不使用 C 样式结构来包含字符串。块信息用于计算字节偏移量和字符串字符类型,以便您可以提取字符串。
Firefox 似乎是为 en-western 构建的,因此您需要这样做,否则您发现 Firefox 将无法加载版本信息来检索 mime-type 和描述字符串。
MSDN article
【讨论】:
这是从硬编码到040904e4
的dll资源中读取插件信息的特定代码部分。写它的时候我不在,但我想这就是它的历史发展方式,并且完全独立于实际的 Firefox 语言环境。【参考方案2】:
我真的不知道什么不同的修改使它起作用。问题实际上出在资源文件中,或者可能在定义中。我已将子块040904b0
更改为040904e4
,文件和产品版本更改为4,5,0,0
(因此使它们成为 4 位,我仍然不知道是否重要),在末尾添加了 '\0'在每个VALUE
中,将字符串版本的格式更改为'%d, %d, %d, %d'
,添加了一些额外的VALUE
s 和一些额外的定义(XP_WIN;XP_WIN32;MOZILLA_STRICT_API;XPCOM_GLUE
)。
我从
“借来”的所有“想法”本文:http://conedogers.com/2012/11/08/npapi-plugin-sample-for-firefox/
还有这个源代码示例:https://github.com/chrisDwarner/npruntimeSampleCode(在上面的文章中引用了)。
这是我的npplugin.rc
的最终版本:
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
#if 0
/////////////////////////////////////////////////////////////////////////////
// Russian (Russia) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // Russian (Russia) resources
/////////////////////////////////////////////////////////////////////////////
#endif
/////////////////////////////////////////////////////////////////////////////
// English (United States) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 4,5,0,0
PRODUCTVERSION 4,5,0,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
#if 0
BLOCK "040904b0"
#else
BLOCK "040904e4"
#endif
BEGIN
VALUE "CompanyName", "MyCompany Ltd.\0"
VALUE "FileExtents", "myfile\0"
VALUE "FileOpenName", "My File\0"
VALUE "FileDescription", "NPPlugin for me\0"
VALUE "FileVersion", "4, 5, 0, 0\0"
VALUE "InternalName", "npMyPlugin\0"
VALUE "Language", "English (United States)\0"
VALUE "LegalCopyright", "Copyright (C) MyCompany Ltd. 2012\0"
VALUE "LegalTreademarks", " \0"
VALUE "MIMEType", "application/x-myplugin\0"
VALUE "OriginalFilename", "npMyPlugin.dll"
VALUE "PrivateBuild", "\0"
VALUE "ProductName", "My NPPlugin"
VALUE "ProductVersion", "4, 5, 0, 0\0"
VALUE "SpecialBuild", "\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
【讨论】:
资源文件确实有点奇怪。040904e4
是本地化(语言=409
=english,codepage=4e4
=western)。有一些文档here。 Firefox 不会在这里寻找真正的用户语言环境。以上是关于NPAPI 插件未在 Firefox 中加载的主要内容,如果未能解决你的问题,请参考以下文章