1.关于 ppapi

Chrome 浏览器对插件的支持，35 版是个分水岭，35版前，它支持 Mozilla npapi 和 ppapi (Pepper Plugin API) 二种插件协议, 硕正套件一直是通过实现其中的 npapi 在 Chrome 浏览器中展现产品功能的。
Chrome 从 35 版开始，已不再支持 npapi。
硕正软件在 106 企业版中，终于实现了 ppapi 接口协议, 同时仍保留了对 npapi 的支持，使用老版本的 Chrome 和 360浏览器极速模式的用户，页面源码无需做改动。
硕正软件 107 版作了进一步完善，通过 dynaload.js 再封装, 实现了对 ppapi 语法的全兼容。
ppapi 和 npapi 有几个不同之处，首先它是需要手工下载 exe 安装的, 安装包或正版用户安装包制作工具在 www.supcan.cn 的下载区中。安装程序将在桌面和开始菜单建立新的命令行快捷:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --register-pepper-plugins="C:\Program Files\Supcan\supcan.dll;application/x-ppapi-supcan" --no-sandbox --test-type
通过该命令行启动 Chrome, 才能让 Chrome 启用硕正 ppapi 插件。
其次，ppapi 的原始 js 语法也和 npapi 不同，如下是简单例子：

    <html>
    <head>
    <meta http-equiv="content-type" content="text/html; charset=gb2312">
    <script>
     //document加载完毕的事件
     document.addEventListener("DOMContentLoaded", addListener, false);
     function addListener() {  //为 object 添加事件侦听
      AF.addEventListener('message', handleMessage, false);
     }

     //object 的事件侦听入口
     function handleMessage(message) {
      if(message.data.name == "OnReady") { //OnReady 事件: 执行 ppapi 对象的函数
       AF.postMessage(['SetSource', 'reportdata/datacenter.xml']);
       AF.postMessage(['Build', 'report/htmltable4.xml']);
      }
      else if(message.data.name == "OnEvent" && message.data.event == "DblClicked") {
       var p1 = message.data.p1;
       var p2 = message.data.p2;
       alert("鼠标双击在: " + p1 + "," + p2 + " (行,列)");
      }
     }
    </script>
    </head>
    <body>
     <object id="AF" type="application/x-ppapi-supcan" Width="800px" height="500px" core="pure" >
       <param Name="CtlName" Value="BCV1.TreeList">
       <param ...(略) >
     </object>
    </body>
    </html>

在这例子中, 这一行表示为 AF 增加一个事件侦听的回调函数，其实这是 HTML5 的语法, handleMessage是回调函数名，函数名可以任意定义。

    #8#AF.addEventListener('message', handleMessage, false);

再来看看 handleMessage( message ) 函数，里面有我们熟悉的 OnReady、OnEvent, 这些都是事件，无非是合并在同一个回调函数中罢了。
第 14、15 行的 AF.postMessage( ) 就是插件的函数了，相当于是 npapi、IE 下的 func( ), 它表示把一个 json 对象以消息的方式抛给插件，插件收到后异步执行.
当然, ppapi 也有一个同步函数 AF.postMessageAndAwaitResponse( ), 它可以让线程等待、同步返回函数执行结果, 比如在 IE、npapi 开发中，常见的取得报表总行数的语句：

    var rows = AF.func("GetRows", "");

在 ppapi 中，应该写成:

    var rows = AF.postMessageAndAwaitResponse(["GetRows", ""]);

Google ppapi 协议中访问插件的通道只有 postMessage( ) 和 postMessageAndAwaitResponse( ) 这二种.

360浏览器的极速模式其实就是 Chrome 内核，它所采用的 Chrome 源码版本并不低，为什么还能支持 npapi? 因为 Chrome 的源码是支持 npapi 的，但 Google 公司认为 npapi 不安全，故在其自己打包的 Google Chrome 浏览器中直接禁用 .