当前位置: 首页 > news >正文

汉王手写签批控件如何在谷歌、火狐、Edge等浏览器使用

背景

        近日,有网友咨询汉王手写签批控件是否可以通过allWebPlugin中间件技术加载到谷歌、火狐、Edge等浏览器?为此,笔者详细了解了一下汉王手写签批控件,它是一个标准的ActiveX控件,曾经主要在IE浏览器使用,由于微软禁用IE浏览器,导致汉王手写签批控件无法使用。因此,网友希望能在谷歌、火狐、Edge等浏览器上使用这个控件。

        allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品致力于将浏览器插件重新应用到所有浏览器。它不仅可以实现ActiveX控件在现代浏览器上使用,而且集成也非常方便。

准备工作

1、下载allWebPlugin中间件产品,具体如下:

链接:百度网盘 请输入提取码 
提取码:z3q0 

如下图所示,下载allWebPlugin_x86_v2.0.0.20_alpha_演示包_20240908.zip安装包。

安装包截图

​​2、下载汉王手写签批控件,笔者百度网盘放了一份汉王手写签批控件demo实例。具体如下:

链接:百度网盘 请输入提取码 
提取码:z3q0 

如下图所示,下载ESP370ocx正式版-20150515.zip安装包。

下载以上内容,并安装。

汉王手写签批控件demo展示

下面将展示汉王手写签批控件demo html源代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>汉王手写签批测试页面</title><style type="text/css">.style1{font-size: xx-large;font-family: 宋体, Arial, Helvetica, sans-serif;color: #FF3399;}.style2{font-size: 16px;font-family: 宋体, Arial, Helvetica, sans-serif;color: #FF3399;}.style3{font-size: 12px;font-family: 宋体, Arial, Helvetica, sans-serif;color: #000000;}.style4{font-size: 12px;font-family: 宋体, Arial, Helvetica, sans-serif;color: #FF0000;}</style><script language="javascript" type="text/javascript">penwidth = 3;var obj;window.onload = function(){   obj = document.getElementById("HWPenSign"); obj.HWSetBkColor(0xE0F8E0);  obj.HWSetCtlFrame(2, 0x000000);}function Button1_onclick() {res = obj.HWInitialize();
}function Button2_onclick() {var stream;stream = obj.HWFinalize();
}function Button3_onclick() {obj.HWClearPenSign();
}function Button6_onclick() {obj.HWSetPenColor(0x000000);   
}function Button7_onclick() {obj.HWSetPenColor(0xFF0000);   
}function Button8_onclick() {obj.HWSetPenColor(0x00FF00);   
}function Button9_onclick() {obj.HWSetPenColor(0x0000FF);   
}function Button10_onclick() {penwidth++;if(penwidth >5)penwidth = 5;obj.HWSetPenWidth(penwidth);   
}function Button11_onclick() {penwidth--;if(penwidth < 1)penwidth = 1;obj.HWSetPenWidth(penwidth);   
}function Button12_onclick() {obj.HWSetPenMode(1);
}function Button13_onclick() {obj.HWSetPenMode(0);
}function Button14_onclick() {var stream;stream = obj.HWGetBase64Stream(2);alert(stream);
}function Button15_onclick() {obj.HWSetFilePath("e:\\sign.jpg"); obj.HWSaveFile();
}function signComplete() {Button14_onclick();
}function signRestart() {;         
}</script></head>
<body><p align="center"><b><span class="style1">汉王手写签批控件Demo</span><br class="style1" /></p><p style="margin-left: 40px"><b><span class="style2">Demo使用说明</span>:</p><p style="margin-left: 40px"><span class="style3"> (1) &quot;初始化设备&quot; :打开设备,汉王手写板进入签字模式。 因为对设备是独占式的访问,所以在重新进行&quot;初始化设备&quot;动作之前,必须确保已经&quot;关闭设备&quot;。对应接口函数为HWInitialize()。<br /><br />(2) &quot;关闭设备&quot;:关闭设备,汉王手写板进入待机模式。对应接口函数为HWFinalize()。</span></p><p style="margin-left: 40px"><span class="style3">(3) &quot;重新签名&quot;: 清空手写控件界面及汉王手写板上的笔迹。对应接口函数为HWClearPenSign()。<br /><br />(4) &quot;笔宽加粗&quot;/&quot;笔宽减细&quot;:调整画笔的粗细,支持5级设置,默认为3级。对应接口函数为HWSetPenWidth()。<br /><br />(5) &quot;画笔颜色&quot;:设置画笔的颜色。默认为黑色。对应接口函数为HWSetPenColor()。<br><br>(6)&quot;压力笔&quot;/&quot;钢笔&quot;:&quot;压力笔&quot;模式下,笔迹会随着压感发生粗细变化。&quot;钢笔&quot;模式下,笔迹粗细不变。对应接口函数为HWSetPenMode()。</span></p><p style="margin-left: 40px"><span class="style3">(7)&quot;保存图像&quot;: 将图像保存至指定路径,对应接口函数为HWSaveFile()。调用此函数之前,请先调用HWSetFilePath()设置保存路径。支持图像格式为:bmp /jpg /png /gif。<br><br>(8)&quot;Base64Stream&quot;: 支持将图像转化为Base64数据流,以便于网络间的传输。</span></p><p style="margin-left: 40px"><span class="style3">各接口函数的参数和返回值详情,请查阅“汉王手写签批控件接口文档.doc”。</span></p><p style="margin-left: 40px"><br class="style1" />           		<b></p><table width="90%" border="0" align="center" cellpadding="3" cellspacing="0">           <tr class="style7"><td width="30%" vAlign="center" height="217" align="right"><P>签字区域:            </P></td>  <td  align="left"><object id="HWPenSign"name="HWPenSign"classid="clsid:E8F5278C-0C72-4561-8F7E-CCBC3E48C2E3"width="600"height="300"></object></td></tr>                       </table><p>&nbsp;
</p> <p>&nbsp;
</p><p style="margin-left: 500px">签名控制: <input id = "button1" type ="button" value="初始化设备" onclick ="return Button1_onclick()" />&nbsp;&nbsp;<input id = "button2" type ="button" value="关闭设备" onclick ="return Button2_onclick()" />&nbsp;&nbsp; <input id="Button3" type="button" value="重新签名" onclick="return Button3_onclick()" /><br><br> 画笔控制:<input id="Button6" type="button" value="黑色" onclick="return Button6_onclick()" />&nbsp;&nbsp;&nbsp;<input id="Button7" type="button" value="红色" onclick="return Button7_onclick()" />&nbsp;&nbsp;&nbsp;<input id="Button8" type="button" value="绿色" onclick="return Button8_onclick()" />&nbsp;&nbsp;&nbsp;<input id="Button9" type="button" value="蓝色" onclick="return Button9_onclick()" /><br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <input id="Button10" type="button" value="笔宽加粗" onclick="return Button10_onclick()" />&nbsp;&nbsp;&nbsp;<input id="Button11" type="button" value="笔宽减细" onclick="return Button11_onclick()" /> <br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <input id="Button12" type="button" value="压力笔" onclick="return Button12_onclick()" />&nbsp;&nbsp;&nbsp;<input id="Button13" type="button" value="钢笔" onclick="return Button13_onclick()" /><br><br>签名图像:&nbsp;&nbsp;<input id="Button14" type="button" value="Base64Stream" onclick="return Button14_onclick()" />&nbsp;&nbsp;&nbsp;<input id="Button15" type="button" value="保存图像" onclick="return Button15_onclick()" /> &nbsp;&nbsp;<br><br>      </p>
</body>
</html>

allWebPlugin中间件集成步骤

第一步:导入js相关文件

导入jquery.min.js,allWebPlugin.Common.js,allWebPlugin.UI.js文件。

 <script type="text/javascript" src="js/jquery.min.js"></script><script type="text/javascript" src="js/allWebPlugin.Common.js"></script><script type="text/javascript" src="js/allWebPlugin.UI.js"></script>  

第二步:替换<object>页面元素代码

将网页中<object>元素替换成<canvas>元素。如下图所示:

<td  align="left">
<!--object id="HWPenSign"name="HWPenSign"classid="clsid:E8F5278C-0C72-4561-8F7E-CCBC3E48C2E3"width="600"height="300"></object-->
<canvas id="pluginUI" width="600" height="300">
<p class="error">Sorry, It looks as though your browser does not support the canvas tag.</p>
</canvas>
</td>

第三步:拷贝控件创建方法

拷贝控件创建方法CreateContainer及CreatePlugin,将其放到网页onload事件里面,方便页面加载时,创建控件对象。其中createProxyPlugin方法创建控件对象,需要传入控件的classid或者ProgID。

function CreateContainer(){var canvas = document.getElementById('pluginUI');var license = "9y4LEm/V6Su9+CP9ION3CqBZzsnSyJW2BIOmkgGdrKd6LsGVXCWlcRBxGfVF1XOPzC9WxlN0wrsQJJzy/Sb5YUhnxibuGY6cwTXP6MALEUEQFzXbytCCYZ8yuWbKwaSdWw5/nsk02HtT/EqxC9jsQEwXfCiLGpeyww5MszBO4EV6/Whk4dpno9z1IP+gYlZ5emPuZWPcA0xfdPfMd8CdZ7O2Y1kH4iqJRcUDZpZLQZzRaaxD4GC6rmYjAT+0hOxf741S1EV6EjTzdZdllR2Gc3/ho/O+lqeG77Lq/sI7eGuRrB92QT4P/dmWmDpM0Qg9AAAA8AEAAQMCpzvCVYrodJHnQlzcchghAVhG8HkPd/M3WbD7ikYNYSMNpadQHw22md/os+H8in1qcUBIUHlshxFEKT84jEPIP39iTN7E4IqEACvPF8duWkErP8vRvrSSxA67jQEesJV2RkXphVUw20qAYDXse5UBsLuIlpsfae59Q3VuDFyGZ9K7Rj3fGG7lMrQxhNPj0IkDKfsa/4S2vDl43A4JLdGE8PyHMOxOGWIBwAzTQvOIA2gT2bC8bUP2HnHz//04r8CZ848wnMgZ8ifdtBGgPIIvhvhNvdHNW3d7GDWIFz7migklvNukCsVNhNjck73Co8JMQppp5n4RY5Ck0DdBVe1iogABAYICCgGCMEGy6w+KRf1qX5NoDdyEKnrHfuE5hco4f/fwKsNo3Dwo1sUFB9hbxusOUSAAyYDfvQWc4CdxoSf7kM4ojInlHHvTw0ppKCFV7H17iDOXdJFKZmkjeFCeubn3VezepCvW1+Z9s84M2uILZgIGw7eIQ/je0Bz+qEWyiqWbA4QYiTHzUwQtZyntNcqYpS0PxXXmV9I21wh48DIV/9DTeZW5OZwRcHivVXFaqW2uxngqGdbw1xyJ9AMhrGdt9S2R2rd1jzNq7ddiKN09TCt806vlF1zGAxb5zq6WjwPxeG7aoE33cTRnEg5WvNM4puhmYOWYi61D8j8lzXheUCJGpsw39CoAAAEOAAAAAUFXUEY=";	var installPackageUrl = "http://127.0.0.1:6651/install/allwebPlugin_x86_v2.0.1.16_20240806.exe";var installPackageVersion = "2.0.0.16";	hostCnt = new PluginHostCnt();if(hostCnt.IsInstall() == false){//未安装,需要手动安装if(confirm("allWebPlugin中间件未安装或未启动,是否立即安装?")){window.open(installPackageUrl, '_blank');}}else{//已安装,检测是否需要版本更新if(hostCnt.IsNewVersion(installPackageVersion) == false){if(hostCnt.createContainer(canvas,"PluginContainer",license,true) == true){	//hostCnt.UI.ForceShowUI(false);//创建时隐藏插件,需要调用这句,隐藏插件hostCnt.RegisterEvent("OnCreated;OnCommand;OnRibbonCtrlCommand;OnOLECommand");CreatePlugin();}}else{//需要升级alert("检测到升级包,立即升级。");hostCnt.UpdateVersion(installPackageUrl).then(function(data){if(data.code == 0){	//检测是否安装成功var checkInstall = setInterval(function(){if(hostCnt.GetVersion() == installPackageVersion){window.location.reload();clearTimeout(checkInstall);}}, 1000);}else{window.open(installPackageUrl, '_blank');//直接下载包,手动安装}}).catch(function(strErr){window.open(installPackageUrl, '_blank');//直接下载包,手动安装});}}
}function CreatePlugin(){if(hostCnt == null)return;obj = hostCnt.createProxyPlugin("{E8F5278C-0C72-4561-8F7E-CCBC3E48C2E3}");
}

第四步:运行效果

到此,汉王手写签批控件就集成完了。运行效果如下:

汉王手写签批执行效果

集成allWebPlugin完整代码

 为了方便大家了解allWebPlugin中间件技术,现将集成实例代码提供出来,如下如所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>汉王手写签批测试页面</title><meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /><style type="text/css">.style1{font-size: xx-large;font-family: 宋体, Arial, Helvetica, sans-serif;color: #FF3399;}.style2{font-size: 16px;font-family: 宋体, Arial, Helvetica, sans-serif;color: #FF3399;}.style3{font-size: 12px;font-family: 宋体, Arial, Helvetica, sans-serif;color: #000000;}.style4{font-size: 12px;font-family: 宋体, Arial, Helvetica, sans-serif;color: #FF0000;}</style><script type="text/javascript" src="js/jquery.min.js"></script><script type="text/javascript" src="js/allWebPlugin.Common.js"></script><script type="text/javascript" src="js/allWebPlugin.UI.js"></script>   
<script language="javascript" type="text/javascript">penwidth = 3;var obj;var hostCnt = null;
window.onload = function(){   //obj = document.getElementById("HWPenSign");CreateContainer();obj.HWSetBkColor(0xE0F8E0);  obj.HWSetCtlFrame(2, 0x000000);}
function CreateContainer(){var canvas = document.getElementById('pluginUI');var license = "9y4LEm/V6Su9+CP9ION3CqBZzsnSyJW2BIOmkgGdrKd6LsGVXCWlcRBxGfVF1XOPzC9WxlN0wrsQJJzy/Sb5YUhnxibuGY6cwTXP6MALEUEQFzXbytCCYZ8yuWbKwaSdWw5/nsk02HtT/EqxC9jsQEwXfCiLGpeyww5MszBO4EV6/Whk4dpno9z1IP+gYlZ5emPuZWPcA0xfdPfMd8CdZ7O2Y1kH4iqJRcUDZpZLQZzRaaxD4GC6rmYjAT+0hOxf741S1EV6EjTzdZdllR2Gc3/ho/O+lqeG77Lq/sI7eGuRrB92QT4P/dmWmDpM0Qg9AAAA8AEAAQMCpzvCVYrodJHnQlzcchghAVhG8HkPd/M3WbD7ikYNYSMNpadQHw22md/os+H8in1qcUBIUHlshxFEKT84jEPIP39iTN7E4IqEACvPF8duWkErP8vRvrSSxA67jQEesJV2RkXphVUw20qAYDXse5UBsLuIlpsfae59Q3VuDFyGZ9K7Rj3fGG7lMrQxhNPj0IkDKfsa/4S2vDl43A4JLdGE8PyHMOxOGWIBwAzTQvOIA2gT2bC8bUP2HnHz//04r8CZ848wnMgZ8ifdtBGgPIIvhvhNvdHNW3d7GDWIFz7migklvNukCsVNhNjck73Co8JMQppp5n4RY5Ck0DdBVe1iogABAYICCgGCMEGy6w+KRf1qX5NoDdyEKnrHfuE5hco4f/fwKsNo3Dwo1sUFB9hbxusOUSAAyYDfvQWc4CdxoSf7kM4ojInlHHvTw0ppKCFV7H17iDOXdJFKZmkjeFCeubn3VezepCvW1+Z9s84M2uILZgIGw7eIQ/je0Bz+qEWyiqWbA4QYiTHzUwQtZyntNcqYpS0PxXXmV9I21wh48DIV/9DTeZW5OZwRcHivVXFaqW2uxngqGdbw1xyJ9AMhrGdt9S2R2rd1jzNq7ddiKN09TCt806vlF1zGAxb5zq6WjwPxeG7aoE33cTRnEg5WvNM4puhmYOWYi61D8j8lzXheUCJGpsw39CoAAAEOAAAAAUFXUEY=";	var installPackageUrl = "http://127.0.0.1:6651/install/allwebPlugin_x86_v2.0.1.16_20240806.exe";var installPackageVersion = "2.0.0.16";	hostCnt = new PluginHostCnt();if(hostCnt.IsInstall() == false){//未安装,需要手动安装if(confirm("allWebPlugin中间件未安装或未启动,是否立即安装?")){window.open(installPackageUrl, '_blank');}}else{//已安装,检测是否需要版本更新if(hostCnt.IsNewVersion(installPackageVersion) == false){if(hostCnt.createContainer(canvas,"PluginContainer",license,true) == true){	//hostCnt.UI.ForceShowUI(false);//创建时隐藏插件,需要调用这句,隐藏插件hostCnt.RegisterEvent("OnCreated;OnCommand;OnRibbonCtrlCommand;OnOLECommand");CreatePlugin();}}else{//需要升级alert("检测到升级包,立即升级。");hostCnt.UpdateVersion(installPackageUrl).then(function(data){if(data.code == 0){	//检测是否安装成功var checkInstall = setInterval(function(){if(hostCnt.GetVersion() == installPackageVersion){window.location.reload();clearTimeout(checkInstall);}}, 1000);}else{window.open(installPackageUrl, '_blank');//直接下载包,手动安装}}).catch(function(strErr){window.open(installPackageUrl, '_blank');//直接下载包,手动安装});}}
}function CreatePlugin(){if(hostCnt == null)return;//{6888ECA8-57D0-6E0E-9B9B-F1FF9B2DBD86} allWebOffice//{C7F277DC-6C47-AB2C-FB6A-070DC8BE7533} suwellreader//{D89F482C-5045-4DB5-8C53-D2C9EE71D025} 老东家iWebOffice2015//{9BE31822-FDAD-461B-AD51-BE1D1C159921}  VLC//{082ECC40-38F1-4E8F-82D3-216009A96686}  RSignReaderobj = hostCnt.createProxyPlugin("{E8F5278C-0C72-4561-8F7E-CCBC3E48C2E3}");
}function Button1_onclick() {res = obj.HWInitialize();
}function Button2_onclick() {var stream;stream = obj.HWFinalize();
}function Button3_onclick() {obj.HWClearPenSign();
}function Button6_onclick() {obj.HWSetPenColor(0x000000);   
}function Button7_onclick() {obj.HWSetPenColor(0xFF0000);   
}function Button8_onclick() {obj.HWSetPenColor(0x00FF00);   
}function Button9_onclick() {obj.HWSetPenColor(0x0000FF);   
}function Button10_onclick() {penwidth++;if(penwidth >5)penwidth = 5;obj.HWSetPenWidth(penwidth);   
}function Button11_onclick() {penwidth--;if(penwidth < 1)penwidth = 1;obj.HWSetPenWidth(penwidth);   
}function Button12_onclick() {obj.HWSetPenMode(1);
}function Button13_onclick() {obj.HWSetPenMode(0);
}function Button14_onclick() {var stream;stream = obj.HWGetBase64Stream(2);alert(stream);
}function Button15_onclick() {obj.HWSetFilePath("e:\\sign.jpg"); obj.HWSaveFile();
}function signComplete() {Button14_onclick();
}function signRestart() {;         
}</script></head>
<body><p align="center"><b><span class="style1">汉王手写签批控件Demo</span><br class="style1" /></p><p style="margin-left: 40px"><b><span class="style2">Demo使用说明</span>:</p><p style="margin-left: 40px"><span class="style3"> (1) &quot;初始化设备&quot; :打开设备,汉王手写板进入签字模式。 因为对设备是独占式的访问,所以在重新进行&quot;初始化设备&quot;动作之前,必须确保已经&quot;关闭设备&quot;。对应接口函数为HWInitialize()。<br /><br />(2) &quot;关闭设备&quot;:关闭设备,汉王手写板进入待机模式。对应接口函数为HWFinalize()。</span></p><p style="margin-left: 40px"><span class="style3">(3) &quot;重新签名&quot;: 清空手写控件界面及汉王手写板上的笔迹。对应接口函数为HWClearPenSign()。<br /><br />(4) &quot;笔宽加粗&quot;/&quot;笔宽减细&quot;:调整画笔的粗细,支持5级设置,默认为3级。对应接口函数为HWSetPenWidth()。<br /><br />(5) &quot;画笔颜色&quot;:设置画笔的颜色。默认为黑色。对应接口函数为HWSetPenColor()。<br><br>(6)&quot;压力笔&quot;/&quot;钢笔&quot;:&quot;压力笔&quot;模式下,笔迹会随着压感发生粗细变化。&quot;钢笔&quot;模式下,笔迹粗细不变。对应接口函数为HWSetPenMode()。</span></p><p style="margin-left: 40px"><span class="style3">(7)&quot;保存图像&quot;: 将图像保存至指定路径,对应接口函数为HWSaveFile()。调用此函数之前,请先调用HWSetFilePath()设置保存路径。支持图像格式为:bmp /jpg /png /gif。<br><br>(8)&quot;Base64Stream&quot;: 支持将图像转化为Base64数据流,以便于网络间的传输。</span></p><p style="margin-left: 40px"><span class="style3">各接口函数的参数和返回值详情,请查阅“汉王手写签批控件接口文档.doc”。</span></p><p style="margin-left: 40px"><br class="style1" />           		<b></p><table width="90%" border="0" align="center" cellpadding="3" cellspacing="0">           <tr class="style7"><td width="30%" vAlign="center" height="217" align="right"><P>签字区域:            </P></td>  <td  align="left"><!--object id="HWPenSign"name="HWPenSign"classid="clsid:E8F5278C-0C72-4561-8F7E-CCBC3E48C2E3"width="600"height="300"></object--><canvas id="pluginUI" width="600" height="300"><p class="error">Sorry, It looks as though your browser does not support the canvas tag.</p></canvas></td></tr>                       </table><p>&nbsp;
</p> <p>&nbsp;
</p><p style="margin-left: 500px">签名控制: <input id = "button1" type ="button" value="初始化设备" onclick ="return Button1_onclick()" />&nbsp;&nbsp;<input id = "button2" type ="button" value="关闭设备" onclick ="return Button2_onclick()" />&nbsp;&nbsp; <input id="Button3" type="button" value="重新签名" onclick="return Button3_onclick()" /><br><br> 画笔控制:<input id="Button6" type="button" value="黑色" onclick="return Button6_onclick()" />&nbsp;&nbsp;&nbsp;<input id="Button7" type="button" value="红色" onclick="return Button7_onclick()" />&nbsp;&nbsp;&nbsp;<input id="Button8" type="button" value="绿色" onclick="return Button8_onclick()" />&nbsp;&nbsp;&nbsp;<input id="Button9" type="button" value="蓝色" onclick="return Button9_onclick()" /><br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <input id="Button10" type="button" value="笔宽加粗" onclick="return Button10_onclick()" />&nbsp;&nbsp;&nbsp;<input id="Button11" type="button" value="笔宽减细" onclick="return Button11_onclick()" /> <br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <input id="Button12" type="button" value="压力笔" onclick="return Button12_onclick()" />&nbsp;&nbsp;&nbsp;<input id="Button13" type="button" value="钢笔" onclick="return Button13_onclick()" /><br><br>签名图像:&nbsp;&nbsp;<input id="Button14" type="button" value="Base64Stream" onclick="return Button14_onclick()" />&nbsp;&nbsp;&nbsp;<input id="Button15" type="button" value="保存图像" onclick="return Button15_onclick()" /> &nbsp;&nbsp;<br><br>      </p>
</body>
</html>

相关文章:

汉王手写签批控件如何在谷歌、火狐、Edge等浏览器使用

背景 近日&#xff0c;有网友咨询汉王手写签批控件是否可以通过allWebPlugin中间件技术加载到谷歌、火狐、Edge等浏览器&#xff1f;为此&#xff0c;笔者详细了解了一下汉王手写签批控件&#xff0c;它是一个标准的ActiveX控件&#xff0c;曾经主要在IE浏览器使用&#xff0c;…...

Halo 开发者指南——项目运行、构建

准备工作 环境要求 OpenJDK 17 LTSNode.js 20 LTSpnpm 9IntelliJ IDEAGitDocker&#xff08;可选&#xff09; 名词解释 工作目录 指 Halo 所依赖的工作目录&#xff0c;在 Halo 运行的时候会在系统当前用户目录下产生一个 halo-next 的文件夹&#xff0c;绝对路径为 ~/ha…...

【C++】——list

文章目录 list介绍和使用list注意事项 list模拟实现list和vector的不同 list介绍和使用 在C中&#xff0c;list是一个带头双向链表 list注意事项 迭代器失效 删除元素&#xff1a;当使用迭代器删除一个元素时&#xff0c;指向该元素的迭代器会失效&#xff0c;但是不会影响其他…...

07_Python数据类型_集合

Python的基础数据类型 数值类型&#xff1a;整数、浮点数、复数、布尔字符串容器类型&#xff1a;列表、元祖、字典、集合 集合 集合&#xff08;set&#xff09;是Python中一个非常强大的数据类型&#xff0c;它存储的是一组无序且不重复的元素&#xff0c;集合中的元素必须…...

结合人工智能,大数据,物联网等主流技术实现业务流程的闭环整合的名厨亮灶开源了

明厨亮灶视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。AI技术可以24小时…...

vue环境搭建相关介绍

一、路由管理器说明 1.route&#xff1a;译为路由&#xff0c;可以理解为单个路由或者某一个路由。 2.routes&#xff1a;路由集合&#xff0c;可以理解为多个route的集合。 3.router&#xff1a;路由器&#xff0c;可以理解为路由集合的管理者。例如&#xff0c;当我们在页面…...

MyBatis系统学习(四)——MyBatis的关联映射和缓存机制

MyBatis 是一个优秀的持久层框架&#xff0c;它通过 XML 或注解将 Java 对象与 SQL 语句相映射&#xff0c;简化了 JDBC 代码&#xff0c;增强了 SQL 的灵活性。在复杂业务场景中&#xff0c;数据库表之间经常存在一对一、一对多、多对多的关联关系&#xff0c;MyBatis 提供了相…...

【iOS】present和push

【iOS】present和push present和push的比较 present和push都用于iOS的视图切换&#xff0c;并且切换都是可逆的&#xff0c;原始视图不会被销毁&#xff0c;还可以直接更改window的rootViewController来切换视图&#xff0c;但是这种方法不可逆&#xff0c;并且原始视图会被销毁…...

Axure RP 9最新安装程序及汉化包下载(支持Win、Mac版,附下载安装教程)

数月前Axure RP官方已经发布了Axure RP 9的消息&#xff0c;并计划在今年夏天发布beta版本。新版Axure RP 9将是该工具向前迈出的重要一步&#xff0c;其中包括一系列广泛的改进&#xff1a;全面的UI修改&#xff0c;新的设计和文档功能以及前所未有的内部优化。我们已经彻底重…...

k8s环境搭建(续)

查看节点信息并做快照 kubectl get nodes 将components.yml文件上传到master主机 创建nginx&#xff0c;会在添加一个新的pod kubectl run nginx --imagesnginx:latest 查看nginx的pod信息 [rootk8s-master ~]# kubectl get po -Aowide|grep nginx 出现错误&#xff0c;查…...

kali——binwalk的使用

目录 前言 使用方法 分析文件 分离文件 前言 binwalk是一个用于分析、逆向工程和提取固件映像的工具。 binwalk能够分析固件映像文件&#xff0c;识别其中包含的文件。例如&#xff0c;它可以从一个设备固件中提取出压缩文件或图片等嵌入内容。 使用方法 分析文件 binwa…...

Ubuntu 24.04中安装virtualenv

在Ubuntu 24.04中安装virtualenv&#xff0c;可以按照以下步骤进行&#xff1a; 1. 确保Python已安装‌&#xff1a; 在终端中输入python --version或python3 --version来检查Python的安装情况。 python3 --version2. 安装pip‌&#xff08;如果尚未安装&#xff09;&#x…...

一个简约的uniapp登录界面,基于uniapp+vue3+uview-plus

uniapp-vue3-template 一个简约的uniapp登录界面&#xff0c;基于uniappvue3uview-plus 页面主要包括&#xff1a;用户登录&#xff0c;手机验证码登录&#xff0c;用户注册&#xff0c;重置密码等页面 登录进去后为空白模板 源码在文末 界面 源码 uniapp登录界面源码...

系统架构设计师 需求分析篇二

&#x1f4d8; 面向对象分析方法 1. 用例模型 &#x1f4c8; 构建用例模型一般需要经历 4 个阶段&#xff1a; 识别参与者 &#x1f50d;&#xff1a;识别与系统交互的所有事物。合并需求获得用例 &#x1f517;&#xff1a;将需求分配给予其相关的参与者。细化用例描述 &am…...

IP 协议分析《实验报告》

目录 一、 实验目的 二、实验设备和环境 三、实验记录 1、实验环境搭建 2、IP 协议分析 1.设置抓包接口 2.IP 报文分析 3.报文长度计算 4.生存时间 TTL 5.分析总结 3、IP分片 1.IP 分片简介 2.捕获分组 3.结果分析 一、 实验目的 1、掌握 IP 协议数据报格式&…...

人工智能开发实战matplotlib库应用基础

内容导读 matplotlib简介绘制直方图绘制撒点图 一、matplotlib简介 matplotlib是一个Python 2D绘图库&#xff0c;它以多种硬拷贝格式和跨平台的交互式环境生成高质量的图形。 matplotlib 尝试使容易的事情变得更容易&#xff0c;使困难的事情变得可能。 我们只需几行代码…...

Android 源码集成可卸载 APP

android系统包含三类APP: 1、可自由卸载APP安装在 /data/app目录下。 2、系统APP放在 /system/app目录。 3、特权APP放在 /system/priv-app目录。 系统编译后&#xff0c;打包前&#xff0c; /data分区不起作用&#xff0c;因此系统打包前&#xff0c;可以先将APP全部拷贝到 /…...

cJSON-轻量级解析模块、字符串的神——编织STM32C8T6与阿里云信息传递的纽带

编写方向&#xff1a;本人就不泛泛的编写一篇什么一文学会cJSON了&#xff0c;没什么突出点&#xff0c;也就我水水字数&#xff0c;你们看来看去也不懂&#xff0c;本人是从上阿里云传信息接触的cJSON的&#xff0c;我就此写一篇针对性的文章&#xff0c;希望对大家有用&#…...

【Git】Clone

当git clone失败时&#xff0c;出现 RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: CANCEL (err 8) 错误&#xff0c;可能由于网络连接不稳定或仓库太大导致的。 可以尝试以下几种方法来解决这个问题&#xff1a; 增加 Git 的缓冲区大小&#xff1a; git confi…...

web开发 之 HTML、CSS、JavaScript、以及JavaScript的高级框架Vue(学习版2)

一、前言 接下来就是来解决这些问题 二、 Ajax 1.ajax javscript是网页三剑客之一&#xff0c;空用来控制网页的行为的 xml是一种标记语言&#xff0c;是用来存储数据的 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...