Mozilla NPAPI开发示例之一(VS2012 + Win7(64位))
入门级的NPAPI开发。
NPAPI & NPRuntime 简介
Netscape Plugin Application Programming Interface (NPAPI)
NPAPI 原本是由 Netscape 所制定的一组单纯的 C Plugin API,起初是无法支持 Scriptability;于是到了 2004 年底,各家 Browser (IE, Opera, Mozilla 等) 都同意支持NPRuntime 延伸 API 以支持 Scriptability,所以目前若是想写 Plugin则应该以 NPRuntime API 才能跨不同的 Browsers。
下面通过示例来开发一个简单的示例。
第一:资源准备
1.NPAPISDK:现在地址这里下载mozilla源码,解压firefox-4.0.1.source.tar.bz2文件。
2.将 \mozilla-2.0\modules\plugin 目录解压缩出来,里面有我们开发NPAPI插件所需的所有资源。如下图
3.把上一步的plugin解压的文件放固定的目录以便对文件路径进行管理。如F:\BrowersDV\npapi\plugin
4.新建工程,名称一定要以np开头,以适应不同的操作系统,不要太长尽量在把八字节以内。本例为npdzhdemo
下一步:选Win32项目,工程目录和上面解压的plugin文件夹同级,如下图。
点确定:如下图
下一步:注意这里要选DLL和空项目,然后点完成。如下图。
5.导入库文件:
(1)到解压的plugin文件夹的sdk\samples下,(F:\BrowersDV\npapi\plugin\sdk\samples)
把common文件夹(其中包含最重要的npapi最重要的三个文件:np_entry.cpp、npn_gate.cpp、npp_gate.cpp)
copy到上面所建的工程下:(F:\BrowersDV\npapi\npdzhdemo\npdzhdemo)如图:
(2).把common下3个的cpp导入到工程中。如图:
6.新建def文件,名称最好和工程名称一致。
编辑npdzhdemo.def文件。添加代码如下:
LIBRARY "npdzhdemo" EXPORTS
NP_GetEntryPoints @1
NP_Initialize @2
NP_Shutdown @3
7.添加资源文件:
选择Version:
自动生成了resource.h和npdzhdemo.rc。由于要在版本信息中加项,
所以手工编辑npdzhdemo.rc资源文件:
添加插件唯一标识。注意下图中的0x409,1252是语言属性,0x409代表是英文,这里设置防止chorme等浏览器的加载失败。
VALUE "MIMEType", "application/demo-plugin"
下面添加最关键的部分:Plugin实现类:
添加引用类:需要引用解压出的plugin\base\public下的文件,工程属性附加目录设置为如下图:
字符编码集设置:多字节。
设置编译属性:_X86_
8.下面添加关键的类:
Plugin.h代码如下:其中pluginbase.h来自于第二不解压的plugin文件夹的include(F:\BrowersDV\npapi\plugin\sdk\samples\include)
把plugin\sdk\samples\include下的两个文件(plginbase.h和npplat.h)copy到common目录下。
#pragma once
#include "common/pluginbase.h" class Plugin :
public nsPluginInstanceBase
{
private:
NPP m_pNPInstance;
NPBool m_bInitialized; NPWindow* mWindow; HWND m_hWnd; public:
Plugin(NPP pNPInstance);
~Plugin(); NPBool init(NPWindow* pNPWindow);
void shut();
NPBool isInitialized();
};
下面添加Plugin.cpp
#include "Plugin.h"
#include <Windows.h>
#include <WindowsX.h> //gliu add on 2013/10/08 NPAPI有窗口测试 start //窗口过程函数,用于对插件的内容的绘制
static LRESULT CALLBACK PluginWinProc(HWND, UINT, WPARAM, LPARAM);
static WNDPROC lpOldProc = NULL; NPError NS_PluginInitialize()
{
return NPERR_NO_ERROR;
} void NS_PluginShutdown()
{
} Plugin::Plugin(NPP pNPInstance):nsPluginInstanceBase(),
m_pNPInstance(pNPInstance),
m_bInitialized(FALSE)//,m_oldX(0),m_oldY(0),m_newX(0),m_newY(0)
{
//bMdown=false;
m_hWnd = NULL;
} Plugin::~Plugin(void)
{
} NPBool Plugin::init(NPWindow* pNPWindow)
{
mWindow = pNPWindow;
m_hWnd = (HWND)pNPWindow->window;
if (!m_hWnd)
return false; lpOldProc = SubclassWindow(m_hWnd,(WNDPROC)PluginWinProc); SetWindowLongPtr(m_hWnd,GWLP_USERDATA,(LONG_PTR)this); m_bInitialized = TRUE;
return TRUE;
} void Plugin::shut()
{
SubclassWindow(m_hWnd,lpOldProc);
m_hWnd = NULL;
m_bInitialized = FALSE;
} NPBool Plugin::isInitialized()
{
return m_bInitialized;
} nsPluginInstanceBase* NS_NewPluginInstance(nsPluginCreateData* pCreateDataStrut)
{
if (!pCreateDataStrut)
{
return NULL;
} Plugin* pPlugin = new Plugin(pCreateDataStrut->instance);
//BOOL bWindowed = FALSE;
//NPN_SetValue(pCreateDataStrut->instance,NPPVpluginWindowBool,(void*)bWindowed); return pPlugin;
} void NS_DestroyPluginInstance(nsPluginInstanceBase * aPlugin)
{
if(aPlugin)
delete (Plugin *)aPlugin;
} static LRESULT CALLBACK PluginWinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd,&ps);
RECT rc;
GetClientRect(hWnd,&rc);
FillRect(hdc,&rc,(HBRUSH)(COLOR_WINDOW));
Plugin * p = (Plugin*) GetWindowLongPtr(hWnd, GWLP_USERDATA);
if(p) {
char *s = "Hello ,MY FIRST DZH PLUGIN! ---LiuGao 2013/10/08!";//p->GetGuiText();
DrawText(hdc, s, strlen(s), &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
} EndPaint(hWnd, &ps);
}
break;
case WM_LBUTTONDOWN:
{
::MessageBox(hWnd,"LButton down","test", MB_OK);
}
break;
default:
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
} //gliu add on 2013/10/08 NPAPI有窗口测试 end
编译通过OK!编译后的dll位置:F:\BrowersDV\npapi\npdzhdemo\Debug\npdzhdemo.dll
9.注册,测试。
打开注册表命令:32位:regedit,64位: %windir%\SysWOW64\Regedit.exe
打开注册表,在HKEY_CURRENT_USER\SOFTWARE\MozillaPlugins下
新建项->命名为@gw.com/npdzhdemo,并新建字符串。名称为Path。
注册完成!!!
测试
打开火狐浏览器 在地址栏输入“about:plugins” 如果在plugin列表中有本例的npdzhdemo.dll及说明我们的plugin示例已经成功完成
写个简单的npdzhdemo_test.html页面如下图:
<html>
<title>TEST WEB PAGE for media plugin</title>
<body>
<object type="application/dzhdemo-plugin" width=400 height=150 />
<br/>
</body>
</html>
用火狐浏览器打开npdzhdemo_test.html页面,如下图所示。
OK,完成。这主要是有窗口插件的创建。下一篇主要写javascript和NPAPI插件的交互。
Mozilla NPAPI开发示例之一(VS2012 + Win7(64位))的更多相关文章
- Java开发环境配置(Win7 64位系统/server 2008)
下面以jdk1.8.0_05版本为例: 1.在用户变量里新增变量名:JAVA_HOME 变量值:D:\Java\jdk1.8.0_05 (根据实例路径变换) 2.在用户变量里新增变量名:CLASSPA ...
- [转]win7 64位下android开发环境的搭建
本文转自:http://www.cfanz.cn/index.php?c=article&a=read&id=65289 最近换了新电脑,装了win7 64位系统,安装了各种开发环境, ...
- win7 64位andriod开发环境搭建
本文转自:http://www.cfanz.cn/index.php?c=article&a=read&id=65289 最近换了新电脑,装了win7 64位系统,安装了各种开发环境, ...
- win7下android开发环境搭建(win7 64位)
win7下android开发环境搭建(win7 64位) 一.安装 JDK 下载JDK最新版本,下载地址如下: http://www.oracle.com/technetwork/java/jav ...
- win7 64位下android开发环境的搭建
本文转自:http://www.cfanz.cn/index.php?c=article&a=read&id=65289 最近换了新电脑,装了win7 64位系统,安装了各种开发环境, ...
- VS2012在win7 64位机中x86和x64下基本类型的占用空间大小(转)
VS2012在win7 64位机中x86和x64下基本类型的占用空间大小 #include "stdafx.h" #include <windows.h> int _t ...
- 【Qt开发】Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包
Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包 今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库 ...
- WIN7 64位系统搭建WINCE6.0系统遇到的问题
WIN7 64位系统搭建WINCE6.0系统遇到的问题 安装顺序如下: .先装Visual Studio2005: .安装Visual Studio2005 Service Pack 1: .安装Vi ...
- WIN7 64位配置Oracle SQL Developer工具
在使用Oracle SQL 的过程中,很多参考资料,辅导机构,各种书籍绝大多数都是使用PL/SQL进行讲解,但是问题是PL/SQL对WIN7 64位系统支持不好,网上有各种各样的配置教程,我尝试了很多 ...
随机推荐
- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试]:思考题——谢勤政11061197
第一题: 大楼里面的电梯一般分区域,或考虑思考题第四题的情况,运行楼层不一样的电梯属于不同的区域.然后在接口IRequest和IPassenger还有IElevator里面都加上int area这个属 ...
- js中的ajax的运用
XMLHttpRequest对象 IE7+,FireFox,Chrome,Opera,Safari创建XHR对象: var xhr=new XMLHttpRequest(); 创建XHR对象的兼容性写 ...
- POj 2186 Popular Cows[连通分量]
题目大意:给出N头牛,有M种关系u, v.代表u牛崇拜v牛.要求找出有多少头牛被所有牛崇拜着题目链接:http://poj.org/problem?id=2186解题思路:1>求出强连通分量,标 ...
- 关于hibernate的实体类中有集合类型转化成JSON的工具类 - 怀念今天的专栏 - 博客频道
Json 来源:http://blog.csdn.net/zczzsq/article/details/18697045#1536434-hi-1-4387-42d97150898b1af15ddaa ...
- ASP.NET MVC中HttpContext, HttpContextBase, HttpContextWrapper联系
ttpContext HttpContext是最原始的ASP.NET Context. MVC的目的之一是能够单元测试.HttpContext没有base class,并且不是virtual,所以不能 ...
- android 自定义标题栏 titleBar自定义
在value文件夹下添加style.xml <?xml version="1.0" encoding="utf-8"?> <resources ...
- 服务器部署_linuix下 一台nginx 多域名之二
第二个需求: 1. 一台服务器部署了三个应用web1~web3对应三个域名:www.web1.com.www.web2.com.www.web3.com ,方法参照我另外一篇文章 2. 如果用非www ...
- flash 类和对象的关系
每个具体的对象后面都隐藏着抽象的类. flash 中as3.0中所有的类,都是为了创建对象所用的.反过来,所创建的任何具体对象都隐藏着抽象的类. 类可以把它看做函数,类的属性是函数的数据,类的方法是函 ...
- PDF文件结构
概述PDF是一种不依赖应用程序软件.硬件和操作系统的文件格式.PDF页包含文本.图形和图像.页面外观由内容流(content stream)描述,内容流包含一些列图形对象(graphics objec ...
- SQLite入门与分析(八)---存储模型(1)
写在前面:SQLite作为嵌入式数据库,通常针对的应用的数据量相对于通常DBMS的数据量是较小的.所以它的存储模型设计得非常简单,总的来说,SQLite把一个数据文件分成若干大小相等的页面,然后以B树 ...