2012-12-13 125 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語言環境。 –