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_GetEntryPointsNP_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',添加了一些额外的VALUEs 和一些额外的定义(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 中加载的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 请求提示未在 Firefox 中加载游戏

CSS 未在 Chrome 中加载

github页面(.github.io)未在Firefox和Chrome Web浏览器中加载

jQuery插件未在WordPress中加载

Qt 设计器插件未在 Eclipse CDT 中加载

RateIt jquery 插件的图像未在 asp.net 中加载?