2012-12-13 97 views
1

我正在编写一个插件,它将在pluginreg.dat文件中进入[INVALID]部分。我认为我的npplugin.rc文件存在问题。NPAPI插件无法在Firefox中加载

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 

我的问题是其中一个错误或缺什么?

回答

0

我真的不知道什么截然不同的修改它的工作。问题确实存在于资源文件中,或者可能在定义中。我已经将子块040904b0更改为040904e4,文件和产品版本更改为4,5,0,0(因此使它们为4位数,我仍然不知道它是否重要),在每个VALUE的末尾添加了'\ 0',将字符串版本的格式为'%d, %d, %d, %d',增加了一些额外的VALUE和一些额外的定义(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 
+1

资源文件无可否认有点奇怪。 '040904e4'是本地化(语言='409' =英文,codepage ='4e4' =西文)。有一些文档[这里](http://msdn.microsoft.com/en-us/library/windows/desktop/ms647464(v = vs.85).aspx)。 Firefox在这里找不到真正的用户区域设置。 –

2

这是克里斯从conedogers,很高兴见到你发现我的博客是有用的。

Georg是正确的。 Firefox不在寻找Windows语言环境。它看起来像Mozilla有自己的国际化,这是有道理的,因为他们的代码是为多个平台编写的。

这里发生了什么是块“040904e4”告诉二进制文件如何处理下面包含的字符串。版本信息不使用C风格结构来包含字符串。块信息用于计算字节偏移量和字符串字符类型,因此您可以提取字符串。

看来Firefox已经建立了en-western,所以你需要做相同的事情,正如你发现的那样,Firefox将无法加载版本信息来检索MIME类型和描述字符串。

MSDN article

+1

这是从硬编码为'040904e4'的dll资源中读取插件信息的特定代码部分。当它被写入时,我不在那里,但我想它只是历史发展的方式,并且完全独立于实际的Firefox语言环境。 –