一.Netscape Plugin Interface(NPAPI)
大致的说明可以看下官方文档Plugin
本文主要针对于javascript与插件交互部分做一些交流,比如用于数字证书的操作(淘宝和支付宝的插件),用于播放的flash player插件等
与javascript的交互需要用到NPAPI中的npruntime Scripting plugins
下面的部分将以示例的方式说明整个过程如何去实现
在开始前需要从火狐浏览器源代码中获取接口头文件火狐4.0.1源码下载
下载后在\firefox-4.0.1.source\mozilla-2.0\modules\plugin可以找到一些samples和头文件
这里为方便下载,上传了一份单独的plugin文件夹
另外,基于NPAPI的一个跨浏览器插件开发的框架FireBreath,非常容易上手而且据说跨浏览器的支持非常好,但是非常笨重,有些功能不需要的也不太容易去掉
Firebreath,有兴趣的可以去了解下,Firebreath的源代码也可以作为基于NPAPI开发的一些参考
还有一个基于NPAPI做的简单的示例,结构非常简单,不用绕来绕去,相对理解起来也简单许多
二.插件入门开发的示例
开发工具为visual studio 2010
1.新建一个Win32 project,命名以np开头(目的是编译完的Dll名必须以np开头才能被识别为插件)
类型为一个DLL的空工程即可
2.右键选中项目的属性,在VC++ Directories目录下,选择Include Directories,Edit,
将plugin/base/public和plugin/sdk/samples/include添加到include
3.新建Version资源文件
// 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
/
// Chinese (Simplified, PRC) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#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
/
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904e4"
BEGIN
VALUE "CompanyName", "WHU ISS"
VALUE "FileDescription", "A new Plugin For test"
VALUE "FileVersion", "1.0.0.1"
VALUE "InternalName", "npTest.dll"
VALUE "LegalCopyright", "Copyright (C) 2012"
VALUE "MIMEType", "application/x-npTest"
VALUE "OriginalFilename", "npTest.dll"
VALUE "ProductName", "new Plugin Test"
VALUE "ProductVersion", "1.0.0.1"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x804, 1200
END
END
#endif // Chinese (Simplified, PRC) resources
/
#ifndef APSTUDIO_INVOKED
/
//
// Generated from the TEXTINCLUDE 3 resource.
//
/
#endif // not APSTUDIO_INVOKED
需要注意的是Block 必须为040904e4,MIMEType为最后引用插件的标志
4.新建一个Module-Definition File(.def),定义入口函数