精华内容
下载资源
问答
  • ppapi example

    2017-10-01 10:32:40
    https://chromium.googlesource.com/chromium/src/ppapi/ 上面的例子资源
  • 实战内容(5)- NPAPI与PPAPI的区别

    万次阅读 2018-06-12 22:43:00
    Adobe Flash Player PPAPI是Adobe Flash Player专为chrome内核而开发的,能够在各种浏览器、操作系统和移动设备上使用,软件短小精悍,功能强大,兼容性高。它使公司和个人能够构建并带给最终用户美妙的数字体验,使...

    目录

    PPAPI

    NPAPI

    迭代更新


    专栏总览《音视频开发》系列-总览

    PPAPI

    Adobe Flash Player PPAPI是Adobe Flash Player专为chrome内核而开发的,能够在各种浏览器、操作系统和移动设备上使用,软件短小精悍,功能强大,兼容性高。它使公司和个人能够构建并带给最终用户美妙的数字体验,使您能够在把交互式、丰富的内容与视频、图形和动画组合到一起的Web上,享受最富表现力的、引人入胜的体验。

    NPAPI

    Adobe Flash Player NPAPI是当今最流行的插件架构,由网景开发后Mozilla维护,几乎支持所有的浏览器,不过它存在很大的安全隐患,插件可以窃取系统底层权限,发起恶意攻击。

    迭代更新与差异

    2010年,Google在原有网景NPAPI(Netscape Plugin API)基础上开发了新的PPAPI(Pepper Plugin API),将外挂插件全部放到沙盒里运行,2012年Windows、Mac版本的Chrome浏览器先后升级了PPAPI Flash Player,并希望当年年底直接彻底淘汰NPAPI。PPAPI的flash相较于NPAPI来讲,因为全在沙盒里面运行,内存占用更大,而且flash每次更新基本上都是修补安全漏洞。

    展开全文
  • flash安装PPAPI

    2019-10-18 16:00:57
    PPAPI插件是浏览器显示Flash动画必装的控件程序,ppapi的flash是费尽九牛二虎之力找到的资源,直接安装即可,希望对你有帮助。
  • PPAPI开发实例

    2019-01-19 16:16:55
    利用ppapi开发的动态库插件,可以用chrome加载运行,运行命令: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --register-pepper-plugins="动态库名称;application/x-ppapi-hi" “index.html”
  • PPAPI 开发接口

    2019-01-05 11:06:24
    在vs中建立win32工程,将此API文件夹设置为头文件搜索路径,便可以开始你的PPAPI开发之旅啦
  • ppapi_pe_x64.7z

    2020-11-24 13:19:36
    google chrome浏览器支持的ppapi的例子代码. 在Chrome中,PPAPI组件分为两种存在形式: 可信组件:可信的PPAPI组件可以通过平台动态库的形式(Windows下为dll文件,Linux下是so文件)由浏览器直接加载,比如内置的...
  • ppapi控件开发
  • CEF加载PPAPI插件

    万次阅读 热门讨论 2016-01-08 21:52:59
    CEF加载PPAPI plugin的简单示例

    CEF基于Chromium和Webkit而来,支持PPAPI和NaCI。

    CEF3的binary包默认已经支持PPAPI(参考http://magpcss.org/ceforum/viewtopic.php?f=10&t=10509),以cefsimple为例(参考CEF Windows开发环境搭建),可以通过命令行参数来注册PPAPI plugin,通过–url参数传递一个加载对应plugin的html页面。

    下面是我测试可用的一个命令行参数

    --ppapi-out-of-process --register-pepper-plugins="D:\projects\cef_binary_3.2357.1271.g8e0674e_windows32\Release\stub.dll;application/x-ppapi-stub" --url=file:///d:/projects/cef_binary_3.2357.1271.g8e0674e_windows32/Release/stub.html
    

    stub.html非常简单,代码如下:

    <!DOCTYPE html>
    <html>
    <head>
      <title>stub</title>
    </head>
    
    <body>
    
    <embed id="plugin" type="application/x-ppapi-stub">
    
    </body>
    </html>
    

    其中stub.dll是我编译的PPAPI SDK里的示例,做了些许改动。stub.c代码如下:

    // Copyright (c) 2010 The Chromium Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    
    // This is the simplest possible C Pepper plugin that does nothing. If you're
    // using C++, you will want to look at stub.cc which uses the more convenient
    // C++ wrappers.
    
    #include <stddef.h>
    #include <stdint.h>
    #include <Windows.h>
    #include <tchar.h>
    
    #include "ppapi/c/pp_errors.h"
    #include "ppapi/c/pp_module.h"
    #include "ppapi/c/ppb.h"
    #include "ppapi/c/ppp.h"
    #include "ppapi/c/pp_instance.h"
    #include "ppapi/c/ppp_instance.h"
    
    PP_Module g_module_id;
    PPB_GetInterface g_get_browser_interface = NULL;
    
    PP_EXPORT int32_t PPP_InitializeModule(PP_Module module_id,
       PPB_GetInterface get_browser_interface) {
      // Save the global module information for later.
      g_module_id = module_id;
      g_get_browser_interface = get_browser_interface;
      OutputDebugString(_T("PPP_InitializeModule was called\r\n"));
    
      return PP_OK;
    }
    
    PP_EXPORT void PPP_ShutdownModule() {
    OutputDebugString(_T("PPP_ShutdownModule was called\r\n"));
    }
    
    PP_EXPORT const void* PPP_GetInterface(const char* interface_name) {
      // You will normally implement a getter for at least PPP_INSTANCE_INTERFACE
      // here.
      return NULL;
    }
    

    如你所见,我只是使用OutputDebugString函数输出了调试信息。运行cefsimple,使用DbgView工具可以看到我们输出的信息。


    关于PPAPI插件的细节,后面会有一些文章来讲。

    相关文章参考:

    展开全文
  • 理解PPAPI的设计

    万次阅读 2016-01-09 07:48:45
    理解PPAPI的设计,看看插件的一些关键概念

    要理解PPAPI插件的设计,先仔细阅读下面这些文章:

    理解了架构设计,再看代码层面的文档:

    有的链接需要翻墙,天朝的局域网,我爱死你了。

    好啦,现在对PPAPI应该有基本的理解了。接下来我从代码角度来理解一下。

    Module、Instance、Interface

    HTML页面可以通过embed标签来嵌入一个插件,HTML页面被加载时,解析到embed标签,就会根据type属性定位我们注册的PPAPI插件,加载对应的插件库(DLL)。

    当PPAPI的库文件(DLL)被加载到浏览器进程中时,一个Module就产生了。在代码中,通过PP_Module(定义在pp_module.h中)来表示,用于标识一个Module的PP_Module类型实际上是一个int32。Module的标识符通过PPP_InitializeModule函数传入。PPP_InitializeModule函数的原型如下:

    int32_t PPP_InitializeModule(PP_Module module, PPB_GetInterface get_browser_interface) ;
    

    第一个参数就是浏览器分配给你的插件库文件的标识符(handle),一般你需要保存它,后续的有些API会用到。

    所以,一个Module,仅仅标识了library。要想在浏览器上显示点什么,还需要从这个Module里创建一个实例,这个实例代表了我们可以看见并与之交互的网页对象。一个插件实例对象又有两个层面的属性,一个就是标示符,通过PP_Instance(32位整型)来表示;另外一个是用来操作实例对象的接口,用PPP_Instance表示(聚合了各种函数指针的结构体)。

    PPAPI的plugin会导出PPP_GetInterface函数,其原型如下:

    const void* PPP_GetInterface(const char* interface_name);
    

    当浏览器要为HTML页面创建插件实例时,会先调用PPP_GetInterface函数获取一个实例模板指针(可以理解为PPP_Instance的实例,类似一个类,实际上是一个定义了函数指针成员的结构体)。

    PPP_GetInterface函数接受一个字符串名字,返回void*,浏览器拿到万能的void*后会根据名字转换为具体的PPP_instance接口,在后续使用中就通过PPP_instance接口来与插件实例交互(比如具体的创建、销毁等动作)。

    简单的理解,就是PPP_GetInterface会返回能创建Instance的接口PPP_Instance,浏览器调用PPP_Instance来创建实例并与实例交互。

    PPP_instance接口声明如下:

    struct PPP_Instance_1_1 {
    
      PP_Bool (*DidCreate)(PP_Instance instance,
                           uint32_t argc,
                           const char* argn[],
                           const char* argv[]);
      void (*DidDestroy)(PP_Instance instance);
    
      void (*DidChangeView)(PP_Instance instance, PP_Resource view);
    
      void (*DidChangeFocus)(PP_Instance instance, PP_Bool has_focus);
    
      PP_Bool (*HandleDocumentLoad)(PP_Instance instance, PP_Resource url_loader);
    };
    

    如你所见,它就像一个类,DidCreate是构造函数指针,DidDestroy是析构函数指针。创建插件实例对象时,DidCreate会被调用,其第一个参数instance,就是浏览器分配给这个插件实例对象的句柄(32位整数),通常我们可以保存起来供后续的调用使用。具体的说明,可以看ppp_instance.h。

    之前在VS2013编译最简单的PPAPI插件中我们编译了stub插件,它的PPP_GetInterface函数返回NULL,所以,其实浏览器可以加载stub库文件,生成Module,但无法创建Instance。

    要想实作一个有用的PPAPI plugin,必须在PPP_GetInterface中返回真实的PPP_instance接口。下面是graphics_2d_example.c里的PPP_GetInterface函数实现:

    PP_EXPORT const void* PPP_GetInterface(const char* interface_name) {
      if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0)
        return &instance_interface;
      return NULL;
    }
    

    它返回的instance_interface,是这么定义的:

    static PPP_Instance instance_interface = {
      &Instance_DidCreate,
      &Instance_DidDestroy,
      &Instance_DidChangeView,
      &Instance_DidChangeFocus,
      &Instance_HandleDocumentLoad
    };
    

    如你所见,它是一个PPP_Instance,在定义时进行了初始化,把文件内实现的几个函数,赋值给了结构体的5个函数指针。

    浏览器接口PPB_GetInterface

    PPAPI插件要与浏览器交互,也得先有渠道来获取浏览器的功能接口。浏览器提供了很多功能接口,比如PPB_INSTANCE_INTERFACE,PPB_IMAGEDATA_INTERFACE,PPB_GRAPHICS_2D_INTERFACE等。

    这些宏都是字符串,浏览器提供的接口名字宏,以PPB_开头,插件提供的,以PPP_开头。

    插件被加载时,模块初始化函数PPP_InitializeModule会被调用,其原型如下:

    int32_t PPP_InitializeModule(PP_Module module_id,
                                       PPB_GetInterface get_browser_interface);
    

    注意第二个参数,get_browser_interface,它的类型是PPB_GetInterface,是一个函数指针,定义如下:

    typedef const void* (*PPB_GetInterface)(const char* interface_name);
    

    如你所见,这是一个接受一个字符串参数返回void*的函数指针。插件可以在PPP_InitializeModule被调用时保存第一个参数,用它来获取浏览器提供的各种接口。根据接口名字,把返回的void*强制转换为对应的接口来使用。参看graphics_2d_example.c里的实现:

    PP_EXPORT int32_t PPP_InitializeModule(PP_Module module,
                                       PPB_GetInterface get_browser_interface) {
      g_get_browser_interface = get_browser_interface;
    
      g_core_interface = (const PPB_Core*)
          get_browser_interface(PPB_CORE_INTERFACE);
      g_instance_interface = (const PPB_Instance*)
          get_browser_interface(PPB_INSTANCE_INTERFACE);
      g_image_data_interface = (const PPB_ImageData*)
          get_browser_interface(PPB_IMAGEDATA_INTERFACE);
      g_graphics_2d_interface = (const PPB_Graphics2D*)
          get_browser_interface(PPB_GRAPHICS_2D_INTERFACE);
      g_view_interface = (const PPB_View*)
          get_browser_interface(PPB_VIEW_INTERFACE);
      if (!g_core_interface || !g_instance_interface || g_image_data_interface ||
      !g_graphics_2d_interface || !g_view_interface)
        return -1;
    
      return PP_OK;
    }
    

    当我们拿到了浏览器暴露的各种接口,就可以做想干的事情了。


    对于PPAPI插件的设计,先理解到这里,下次我们看插件的加载与使用流程、如何绘图、如何处理交互。

    相关文章参考:

    展开全文
  • PPAPI 插件编写

    千次阅读 2017-03-10 15:42:42
    PPAPI Download the Native Client SDK 创建一个vs2013工程: 新建一个Win32项目,类型选DLL 去掉预编译头文件stdafx.h和stdafx.cpp 在项目属性–>配置属性–>C/C++–>预编译头,把预编译头选项的值设置为不使用预...

    PPAPI


    1. Download the Native Client SDK
    2. 创建一个vs2013工程:
      • 新建一个Win32项目,类型选DLL
      • 去掉预编译头文件stdafx.h和stdafx.cpp
      • 在项目属性–>配置属性–>C/C++–>预编译头,把预编译头选项的值设置为不使用预编译头。
    3. 将一下代码粘贴到项目中。
    #include "ppapi/cpp/instance.h"
    #include "ppapi/cpp/module.h"
    #include "ppapi/cpp/var.h"
    
    /// The Instance class.  One of these exists for each instance of your NaCl
    /// module on the web page.  The browser will ask the Module object to create
    /// a new Instance for each occurrence of the <embed> tag that has these
    /// attributes:
    ///     src="hello_tutorial.nmf"
    ///     type="application/x-pnacl"
    /// To communicate with the browser, you must override HandleMessage() to
    /// receive messages from the browser, and use PostMessage() to send messages
    /// back to the browser.  Note that this interface is asynchronous.
    class HelloTutorialInstance : public pp::Instance {
     public:
      /// The constructor creates the plugin-side instance.
      /// @param[in] instance the handle to the browser-side plugin instance.
      explicit HelloTutorialInstance(PP_Instance instance) : pp::Instance(instance)
      {
        pp::Var var_reply = pp::Var("hello from Pepper Plugin");
        PostMessage(var_reply);
      }
      virtual ~HelloTutorialInstance() {}
    
      /// Handler for messages coming in from the browser via postMessage().  The
      /// @a var_message can contain be any pp:Var type; for example int, string
      /// Array or Dictinary. Please see the pp:Var documentation for more details.
      /// @param[in] var_message The message posted by the browser.
      virtual void HandleMessage(const pp::Var& var_message) {
        // TODO(sdk_user): 1. Make this function handle the incoming message.
      }
    };
    
    /// The Module class.  The browser calls the CreateInstance() method to create
    /// an instance of your NaCl module on the web page.  The browser creates a new
    /// instance for each <embed> tag with type="application/x-pnacl".
    class HelloTutorialModule : public pp::Module {
     public:
      HelloTutorialModule() : pp::Module() {}
      virtual ~HelloTutorialModule() {}
    
      /// Create and return a HelloTutorialInstance object.
      /// @param[in] instance The browser-side instance.
      /// @return the plugin-side instance.
      virtual pp::Instance* CreateInstance(PP_Instance instance) {
        return new HelloTutorialInstance(instance);
      }
    };
    
    namespace pp {
    /// Factory function called by the browser when the module is first loaded.
    /// The browser keeps a singleton of this module.  It calls the
    /// CreateInstance() method on the object you return to make instances.  There
    /// is one instance per <embed> tag on the page.  This is the main binding
    /// point for your NaCl module with the browser.
    Module* CreateModule() {
      return new HelloTutorialModule();
    }
    }  // namespace pp

    插入所需头文件路径,库路径以及相关库。在“nacl_sdk\pepper_49…”下。pepper_49中“49”是我安装的版本号。
    4. 编译生成dll文件,以下是使用electron测试插件。
    5. 测试:
    main.js

    var app = require('app');
    var BrowserWindow = require('browser-window');
    var path = require('path')
    
    var mainWindow = null;
    
    app.commandLine.appendSwitch('register-pepper-plugins', path.join(__dirname, 'libppapi_hello.so;application/x-hello'))
    
    app.on('ready', function() {
    
      mainWindow = new BrowserWindow({
          height: 800,
          width: 1024,
          'web-preferences' : {
            'p

    nacl.html

    <!DOCTYPE html>
    <html>
      <!--
      Copyright (c) 2013 The Chromium Authors. All rights reserved.
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file.
      -->
    <head>
    
      <title>hello_tutorial</title>
      <script type="text/javascript">
        // The 'message' event handler.  This handler is fired when the NaCl module
        // posts a message to the browser by calling PPB_Messaging.PostMessage()
        // (in C) or pp::Instance.PostMessage() (in C++).  This implementation
        // simply displays the content of the message in an alert panel.
        function handleMessage(message_event) {
          alert(message_event.data);
        }
      </script>
    </head>
    <body>
    
      <h1>NaCl C++ Tutorial: Getting Started</h1>
      <p>
        <div id="listener">
          <script type="text/javascript">
            var listener = document.getElementById('listener');
            listener.addEventListener('message', handleMessage, true);
          </script>
    
          <embed id="hello_tutorial"
                 width=0 height=0
                 type="application/x-hello" />
        </div>
      </p>
    </body>
    </html>

    package.json

    {
      "main": "main.js",
      "name": "Pepper plugin test",
      "description": "testing third party plugin load",
      "version": "0.0.1",
      "license": "MIT"
    }

    使用electron启动相关应用后可以看到,页面启动后弹出提示框。
    页面启动后弹出提示框

    展开全文
  • PPAPI主机NPAPI插件适配器。 如您所知,Adobe暂停了针对GNU / Linux的Flash Player插件的进一步开发。 作为NPAPI插件版本11.2的最新版本将获得五年的安全更新(自2012年5月4日发布以来),但已停止进一步开发。 ...
  • PPAPI重新编译

    2019-06-04 11:24:18
    ppapi_cpp.lib(view.o) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1800”不匹配值“1600”(sipinstance.obj 中) 后来看到网上说可以重新编译ppapi_cpp.lib,于是按下面的步骤重新编译了: 打开Visual ...
  • ppapi,npapi

    千次阅读 2018-01-18 21:43:00
    PPAPI也就是Pepper Plugin API,是在原有网景NPAPI(Netscape Plugin API)基础上发展而来的。NPAPI是当今最流行的插件架构,几乎所有浏览器都支持,不过存在很大的安全隐患,插件可以窃取系统底层权限,发起恶意攻击...
  • 使用vs2010重新编译了ppapi_cpp.lib,解决编译报错的问题,文档中包含了ppapi的include和lib文件,修改一下引用路基就可以编译运行(引用路径忘记写成相对路径了,所以得自己修改一下)。
  • chromium.googlesource.com/chromium/src/ppapi
  • Chrome PPAPI插件只能使用PPAPI接口的NativeClient(NaCl)方式编写, Native Client分别有三种embed类型: 1、“application/x-ppapi”:平台相关,唯一能直接使用win32 api的platfrom(有功能上的限制)。dll格式...
  • NPAPI和PPAPI开发

    万次阅读 热门讨论 2015-10-21 13:11:08
    介绍NPAPI和PPAPI的具体开发过程!
  • PPAPI 通用 使用 PPAPI C-API 的通用部件或 NaCl 模块。 用法 使用将libppapi_common安装到 NaCl SDK 中: naclports --toolchain=pnacl --arch=pnacl -v install ppapi-common 基于 NaCl SDK 构建 Docker 镜像: ...
  • PPAPI插件的全屏切换处理

    千次阅读 2016-03-08 15:44:20
    有时你会想让PPAPI插件全屏(比如播放视频时),这次来看看怎么做。PPAPI和CEF App两侧都要处理。
  • chrome PPAPI 开发(一)

    千次阅读 2019-01-05 11:42:43
     在网上翻来覆去找资料,最终的矛头都指向chrome的 PPAPI 开发,于是下载了一个ppapi的资源包。大家可从“我的资源”去下载。  下面说一下如何开发一个可调试的ppapi 例子的过程。  1. 环境准备  安装Visual...
  • PPAPI插件的动态创建、修改、删除

    千次阅读 2016-03-09 09:48:28
    一旦你完成了PPAPI插件的开发,实际使用时可能会有下列需求:动态创建PPAPI插件、删除PPAPI插件、改变PPAPI插件的尺寸
  • Opera 和 Chromium 的应用程序的 Flash Player 内容调试器 – PPAPI。最新版本是31.0.0.108( Windows )。
  • PPAPI插件与浏览器的通信

    万次阅读 2016-01-14 20:24:51
    PPAPI的插件,不能使用JS与浏览器交,应该通过PPB_Messaging接口来完成Plugin和浏览器的交互……
  • Flash.Player.PPAPI.32.0.0.207 Flash.Player.PPAPI.32.0.0.207
  • PPAPI开发FAQ

    2016-06-23 10:09:10
    PPAPI,用于开发支持Chrome的浏览器插件。 基础: (1)https://developer.chrome.com/native-client/devguide/tutorial/tutorial-part1 下载并安装nacal环境 (2)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,628
精华内容 651
关键字:

ppapi