入门级的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.hnpdzhdemo.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位))的更多相关文章

  1. Java开发环境配置(Win7 64位系统/server 2008)

    下面以jdk1.8.0_05版本为例: 1.在用户变量里新增变量名:JAVA_HOME 变量值:D:\Java\jdk1.8.0_05 (根据实例路径变换) 2.在用户变量里新增变量名:CLASSPA ...

  2. [转]win7 64位下android开发环境的搭建

    本文转自:http://www.cfanz.cn/index.php?c=article&a=read&id=65289 最近换了新电脑,装了win7 64位系统,安装了各种开发环境, ...

  3. win7 64位andriod开发环境搭建

    本文转自:http://www.cfanz.cn/index.php?c=article&a=read&id=65289 最近换了新电脑,装了win7 64位系统,安装了各种开发环境, ...

  4. win7下android开发环境搭建(win7 64位)

    win7下android开发环境搭建(win7 64位)   一.安装 JDK 下载JDK最新版本,下载地址如下: http://www.oracle.com/technetwork/java/jav ...

  5. win7 64位下android开发环境的搭建

    本文转自:http://www.cfanz.cn/index.php?c=article&a=read&id=65289 最近换了新电脑,装了win7 64位系统,安装了各种开发环境, ...

  6. VS2012在win7 64位机中x86和x64下基本类型的占用空间大小(转)

    VS2012在win7 64位机中x86和x64下基本类型的占用空间大小 #include "stdafx.h" #include <windows.h> int _t ...

  7. 【Qt开发】Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包

    Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包 今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库 ...

  8. WIN7 64位系统搭建WINCE6.0系统遇到的问题

    WIN7 64位系统搭建WINCE6.0系统遇到的问题 安装顺序如下: .先装Visual Studio2005: .安装Visual Studio2005 Service Pack 1: .安装Vi ...

  9. WIN7 64位配置Oracle SQL Developer工具

    在使用Oracle SQL 的过程中,很多参考资料,辅导机构,各种书籍绝大多数都是使用PL/SQL进行讲解,但是问题是PL/SQL对WIN7 64位系统支持不好,网上有各种各样的配置教程,我尝试了很多 ...

随机推荐

  1. 解决WP8应用里ListBox绑定数据变多导致越来越卡

    ListBox控件绑定数据,当滑动到底部的时候加载数据到列表上,这样就会产生一个问题,当ListBox上面绑定的数据有几千条的时候,界面将会卡顿,我们可以通过在ListBox上只绑定指定数量的数据,其 ...

  2. 上下切换js

    <div class="wview"> <span class="prevs" id="prevs-j"></ ...

  3. win7(x64)+VS2012+cocos2d-x环境的配置以及试运行

    原地址:http://blog.csdn.net/gf771115/article/details/20740993 转自:http://blog.sina.com.cn/s/blog_62df697 ...

  4. C#读取Excel五种方式的体会

    原地址: http://blog.csdn.net/dapengbusi/article/details/38117817 http://blog.csdn.net/dapengbusi/articl ...

  5. 如何使用 Java8 实现观察者模式?(上)

    [编者按]本文作者是 BAE 系统公司的软件工程师 Justin Albano.在本篇文章中,作者通过在 Java8 环境下实现观察者模式的实例,进一步介绍了什么是观察者模式.专业化及其命名规则,供大 ...

  6. 安装java memcached client到本地maven repository

    由于目前java memcached client没有官方的maven repository可供使用,因此使用时需要手动将其安装到本地repository.java memcached client的 ...

  7. Pascal Game Development with Jason McMillen

    In this much belated episode I talk with Jason McMillen of Pascal Game Development. We discuss the s ...

  8. 关于checkbox的checked属性和change事件

    jquery中的attr和prop有什么区别? To retrieve and change DOM properties such as the checked, selected, or disa ...

  9. MySQL结果集处理

    问题: 1. MySQL对查询的结果集如果返回,一次性还是每条?2. 客户端如何接收结果集? 1. 对于有返回结果集的查询,server端和client端交互的数据包由以下组成: p1:meta da ...

  10. c#语言-多线程中的锁系统(一)

    介绍 平常在多线程开发中,总避免不了线程同步.本篇就对net多线程中的锁系统做个简单描述.   目录 一:lock.Monitor        1:基础.        2: 作用域.       ...