function webSocket(){
if("WebSocket" in window){ console.log("您的浏览器支持WebSocket"); var ws = new WebSocket("ws://localhost:8080"); //创建WebSocket连接 //... }else{ console.log("您的浏览器不支持WebSocket"); }
}
鉴于office安装问题太烦人,于是打算彻底干掉它。除了前面讲的用Open锁定msi.dll的方法外,还有更好的方法。
Open虽然简单,但会禁止msi文件,所以又找到一种新的不妨碍其它程序的办法。
方法是hook当前进程的ZwOpenFile(NtOpenFile),发现是msi.dll时跳过即可。
代码如下:
'窗体
Option Explicit
Private Sub Form_Load()
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
Me.Show
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Unhook
End Sub
'模块
Option Explicit
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function ZwOpenFile Lib "NTDLL.DLL" (ByRef Filehandle As Long, _
ByVal DesiredAccess As Long, _
ByRef ObjectAttributes As OBJECT_ATTRIBUTES, _
ByRef IoStatusBlock As IO_STATUS_BLOCK, _
ByVal ShareAccess As Long, _
ByVal OpenOptions As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
Private Const STATUS_OBJECT_NAME_NOT_FOUND = &HC0000034
Private Type IO_STATUS_BLOCK
Status As Long
Information As Long
End Type
Private Type OBJECT_ATTRIBUTES
length As Long
RootDirectory As Long
ObjectName As Long
Attributes As Long
SecurityDescriptor As Long
SecurityQualityOfService As Long
End Type
Private MyHook As cls_HookApi '自定义hook
Sub Main()
App.TaskVisible = False
Set MyHook = New cls_HookApi
MyHook.HookApi "ntdll.dll", "ZwOpenFile", GetFunAddr(AddressOf ZwOpenFileCallback), GetCurrentProcess
Load frm_Main
End Sub
'NtOpenFile回调
Public Function ZwOpenFileCallback(Filehandle As Long, ByVal DesiredAccess As Long, ObjectAttributes As OBJECT_ATTRIBUTES, IoStatusBlock As IO_STATUS_BLOCK, ByVal ShareAccess As Long, ByVal OpenOptions As Long) As Long
Dim lRetVal As Long
MyHook.HookStatus False
'Debug.Print ObjectAttrToName(ObjectAttributes)
If LCase(ObjectAttrToName(ObjectAttributes)) Like LCase("*msi.dll") Then
lRetVal = STATUS_OBJECT_NAME_NOT_FOUND '返回值改为对象不存在
Else
lRetVal = ZwOpenFile(Filehandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions)
End If
MyHook.HookStatus True
ZwOpenFileCallback = lRetVal
End Function
'得到文件名称
Private Function ObjectAttrToName(ObjectAttr As OBJECT_ATTRIBUTES) As String
Dim bytCode() As Byte
Dim dwName As Long
Dim dwLength As Integer
CopyMemory dwLength, ByVal ObjectAttr.ObjectName, 2
If dwLength > 0 Then
CopyMemory dwName, ByVal ObjectAttr.ObjectName + 4, 4
ReDim bytCode(dwLength - 1)
CopyMemory bytCode(0), ByVal dwName, dwLength
ObjectAttrToName = StrConv(StrConv(bytCode, vbUnicode), vbFromUnicode)
ObjectAttrToName = Replace(ObjectAttrToName, "\??\", "")
End If
Erase bytCode
End Function
Public Function GetFunAddr(lngFunAddr As Long) As Long
GetFunAddr = lngFunAddr
End Function
Sub Unhook()
Set MyHook = Nothing
End Sub
'类
Option Explicit
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)
Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Private mbytOldCode(5) As Byte
Private mbytNewCode(5) As Byte
Private mlngFunAddr As Long
Private mhProcess As Long
Public Function HookApi(ByVal strDllName As String, ByVal strFunName As String, ByVal lngFunAddr As Long, ByVal hProcess As Long) As Boolean
Dim hModule As Long, dwJmpAddr As Long
mhProcess = GetCurrentProcess
hModule = LoadLibrary(strDllName)
If hModule = 0 Then HookApi = False: Exit Function
mlngFunAddr = GetProcAddress(hModule, strFunName)
If mlngFunAddr = 0 Then HookApi = False: Exit Function
CopyMemory mbytOldCode(0), ByVal mlngFunAddr, 6
mbytNewCode(0) = &HE9
dwJmpAddr = lngFunAddr - mlngFunAddr - 5
CopyMemory mbytNewCode(1), dwJmpAddr, 4
HookStatus True
HookApi = True
End Function
Public Function HookStatus(ByVal blnIsHook As Boolean) As Boolean
If blnIsHook Then
If WriteProcessMemory(mhProcess, ByVal mlngFunAddr, mbytNewCode(0), 5, 0) <> 0 Then HookStatus = True '拦截
Else
If WriteProcessMemory(mhProcess, ByVal mlngFunAddr, mbytOldCode(0), 5, 0) <> 0 Then HookStatus = False '恢复
End If
End Function
Private Sub Class_Terminate()
HookStatus False
End Sub
'****完成****
附上前两种方法:
方法一:一句代码搞定:
Open "msi.dll" For Binary Lock Read Write As #235 '自己定义文件号
方法二:使用API OpenFile或CreateFile(需完整路径)
Private Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, lpReOpenBuff As Long, ByVal wStyle As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private hFile_Msi As Long
Sub LockMsi()
hFile_Msi = OpenFile("msi.dll", ByVal VarPtr(0&), &H10)
'Debug.Print hFile_Msi
End Sub
Sub UnLockMsi()
If hFile_Msi > 0 Then CloseHandle hFile_Msi
End Sub
Sub Main()
LockMsi '先锁定,再加载窗体
Load Form1
Form1.Show
End Sub
Private Declare Sub Sleep Lib "kernel32 " (ByVal dwMilliseconds As Long)
Private Sub CommInit()
Call Commsetting(FirstCOM, FirstComSet)
MSComm1.InputMode = 1 ' comInputModeBinary '//以二进制方式读数据
MSComm1.InputLen = 0 '//设置或返回一次从接收缓冲区中读取字节数,0表示一次读取所有数据
MSComm1.InBufferSize = 512 '//设置接收缓冲区512 Byte
MSComm1.InBufferCount = 0
MSComm1.OutBufferSize = 512 '//设置发送缓冲区512 Byte
MSComm1.OutBufferCount = 0
MSComm1.RThreshold = 6 'InputDataLen '//n个字符到接收缓冲区都触发接收事件
MSComm1.SThreshold = 0 'OutputDataLen
End Sub
Private Sub MSComm1_OnComm()
Dim ComDATA() As Byte
Dim temp As String
Dim i As Integer
On Error GoTo ErrOnCom
If DisReceive = True Then
Exit Sub
End If
Select Case MSComm1.CommEvent
Case comEvReceive
Sleep 100
ComDATA = MSComm1.Input
For i = 0 To UBound(ComDATA)
InputData(i) = ComDATA(i)
Next i
End Select
End Sub
$user_info = $mp->encryptor->decryptData($session_key, $request->iv, $request->encryptedData); EasyWechat 小程序获取手机号onGetPhoneNumber解密消息 有时会出现 The given payload is invalid. 数据无效。
#210
#211
百度地图对应缩放级别 int[] zoomLevel = { 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6,5, 4, 3 }; 对应级别单位 String[] zoomLevelStr = { “10”, “20”, “50”, “100”, “200”, “500”, “1000”, “2000”, “5000”, “10000”, “20000”, “25000”, “50000”, “100000”, “200000”, “500000”, “1000000”, “2000000” }; // 单位/m
/** * 获取缩放级别 * @param distance 2点之间距离 * @return int zoomLevel */ public int getZoomLevel(float distance) { int mid = (int) (distance * 100); for (int i = 0; i < zoomLevelStr.length; i++) { if (i < zoomLevelStr.length - 1) { int left = Integer.valueOf(zoomLevelStr[i]); int right = Integer.valueOf(zoomLevelStr[i + 1]); if (mid < left) { return zoomLevel[i]; } else if (mid > left && mid < right) { return zoomLevel[i + 1]; } } else { return 3; } } return 18; }
LatLng llCentre = new LatLng(location.getLatitude(),location.getLongitude()); MapStatus.Builder builder = new MapStatus.Builder(); builder.target(llCentre )//缩放中心点 .zoom(zoomLv)//缩放级别 mBaiduMap.animateMapStatus(MapStatusUpdateFactory .newMapStatus(builder.build()));
#212
将 OPTIONS="-r /var/svn" 改为 svn 版本库存放的目录
OPTIONS="-r /var/svn/svnrepos/"
svnadmin create /var/svn/svnrepos/xxxx (xxxx为你预期的版本库名称,可自定义)
[general] #匿名访问的权限,可以是read,write,none,默认为read anon-access=none #使授权用户有写权限 auth-access=write #密码数据库的路径
#213
shell "explorer.exe ""c:\abc""",vbnormalfocus
vb点击关闭按钮时窗体隐藏
vb点击关闭按钮时会产生 UnloadMode = 0,可以通过它来判断实现
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) If UnloadMode = 0 Then Me.Hide Cancel = 1 End if End Sub
用VB打开网页
Shell "explorer.exe http://www.baidu.com"
VB6系统托盘.zip
#214
var ws = new WebSocket("ws://localhost:8080"); //申请一个WebSocket对象,参数是服务端地址,同http协议使用http://开头一样,WebSocket协议的url使用ws://开头,另外安全的WebSocket协议使用wss://开头 ws.onopen = function(){ //当WebSocket创建成功时,触发onopen事件 console.log("open"); ws.send("hello"); //将消息发送到服务端 }ws.onmessage = function(e){ //当客户端收到服务端发来的消息时,触发onmessage事件,参数e.data包含server传递过来的数据 console.log(e.data);}ws.onclose = function(e){ //当客户端收到服务端发送的关闭连接请求时,触发onclose事件 console.log("close");}ws.onerror = function(e){ //如果出现连接、处理、接收、发送数据失败的时候触发onerror事件 console.log(error);}
#215
function webSocket(){ if("WebSocket" in window){ console.log("您的浏览器支持WebSocket"); var ws = new WebSocket("ws://localhost:8080"); //创建WebSocket连接 //... }else{ console.log("您的浏览器不支持WebSocket"); } }
#216
GPS 经纬度格式转换 我们可以简单的把经纬度分为两种:WGS84 和 NMEA 格式。一般的地图系统都是采用 WGS84 这种国际 GPS 数据格式标准,由于兼容性问题,我们模块的定位指令输出的格式就 是这两种。只有AT+GPSLOC指令输出的是NMEA格式,其它基站定位指令比如AT+TKPOS, AT+ENBR 都是输出 WGS84 格式。 他们之间的转换关系大概如下: 从 NMEA 转换为 WGS84 格式 double nmea_ndeg2degree(double val) { double deg = ((int)(val / 100)); val = deg + (val - deg * 100) / 60; return val; } 从 WGS84 格式转换为 NMEA 格式: double nmea_degree2ndeg(double val) { double int_part; double fra_part; fra_part = modf(val, &int_part); val = int_part * 100 + fra_part * 60; return val; }
#217
GPS坐标转换经纬度及换算方法 GPS坐标和经纬度的算法和概率不太一样,但是我们可能会将他们互通起来用,下面先贴上我做的转换工具:http://map.yanue.net/gps.html。里面实现了gps到谷歌地图百度地图经纬度的转换。不含糊,下面将他们之间的联系。 GPS坐标系我本身不太了解它跟谷歌地图经纬度有多大区别,于是搜了一下,看看他们的区别: 地形图坐标系:我国的地形图采用高斯-克吕格平面直角坐标系。在该坐标系中,横轴:赤道,用Y表示;纵轴:中央经线,用X表示;坐标原点:中央经线与赤 道的交点,用0表示。赤道以南为负,以北为正;中央经线以东为正,以西为负。我国位于北半球,故纵坐标均为正值,但为避免中央经度线以西为负值的情况,将 坐标纵轴西移500公里。 北京54坐标系:1954年我国在北京设立了大地坐标原点,采用克拉索夫斯基椭球体,依此计算出来的各大地控制点的坐标,称为北京54坐标系。 GS84坐标系:即世界通用的经纬度坐标系。 经纬度表示:1884年国际经度会议规定,以通过英国伦敦格林威治天文台子午仪中心的经线为0°经线。从0°经线往东叫东经,往西叫西经,东、西各分180°。习惯 上以西经20°和东经160°为分界把地球分为东西两个半球。假如从地轴的正中间将地球切成南北两半,上边的一半叫北半球,下边的一半叫南半球。被切的这 个平面,叫赤道面。赤道面与地球表面相交的线叫赤道。纬线从赤道往两极越来越短,到了两极就缩小成一个点了。科学家们把赤道定为0°纬线,从赤道向两极各 分为90°,赤道以南叫南纬,赤道以北叫北纬。在计算机或GPS上经纬度经常用度、分、秒和度.度、分.分、秒.秒的混合方式进行表示,度、分、秒间的进 制是60进制,度.度、分.分、秒.秒的进制是100进制,换算时一定要注意。可以近似地认为每个纬度之间的距离是不变的111KM,每分间 1.85KM,每秒间31.8M。经度间的距离随纬度增高逐渐减小,可按以下公式计算: 经度1°长度=111.413cosφ一0.094cos3φ公里(纬度φ处)。 一般从GPS得到的数据是经纬度。经纬度有多种表示方法。 1.) ddd.ddddd, 度 . 度的十进制小数部分(5位)例如:31.12035º 2.) ddd.mm.mmm,度 . 分 . 分的十进制小数部分(3位)例如 31º10.335' 3.) ddd.mm.ss, 度 . 分 . 秒 例如 31º12'42" 地球上任何一个固定的点都可以用确定的经纬度表示出来。 关于经纬度坐标转换的方法 一、十进制转换成经纬度 把经纬度转换成十进制的方法很简 如下就可以了 Decimal Degrees = Degrees + minutes/60 + seconds/3600 例:57°55'56.6" =57+55/60+56.6/3600=57.9323888888888 114°65'24.6"=114+65/60+24.6/3600=结果自己算! 如把经纬度 (longitude,latitude) (205.395583333332,57.9323888888888) 转换据成坐标(Degrees,minutes,seconds)(205°23'44.1",57°55'56.6")。 步骤如下: 1, 直接读取"度":205 2,(205.395583333332-205)*60=23.734999999920 得到"分":23 3,(23.734999999920-23)*60=44.099999995200 得到"秒":44.1 采用同样的方法可以得到纬度坐标:57°55'56.6" 好大一篇,都是别的地方copy过来的,有兴趣就自己看看吧 The end
#218
鉴于office安装问题太烦人,于是打算彻底干掉它。除了前面讲的用Open锁定msi.dll的方法外,还有更好的方法。 Open虽然简单,但会禁止msi文件,所以又找到一种新的不妨碍其它程序的办法。 方法是hook当前进程的ZwOpenFile(NtOpenFile),发现是msi.dll时跳过即可。 代码如下: '窗体 Option Explicit Private Sub Form_Load() Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2 Me.Show End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Unhook End Sub '模块 Option Explicit Private Declare Function GetCurrentProcess Lib "kernel32" () As Long Private Declare Function ZwOpenFile Lib "NTDLL.DLL" (ByRef Filehandle As Long, _ ByVal DesiredAccess As Long, _ ByRef ObjectAttributes As OBJECT_ATTRIBUTES, _ ByRef IoStatusBlock As IO_STATUS_BLOCK, _ ByVal ShareAccess As Long, _ ByVal OpenOptions As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long) Private Const STATUS_OBJECT_NAME_NOT_FOUND = &HC0000034 Private Type IO_STATUS_BLOCK Status As Long Information As Long End Type Private Type OBJECT_ATTRIBUTES length As Long RootDirectory As Long ObjectName As Long Attributes As Long SecurityDescriptor As Long SecurityQualityOfService As Long End Type Private MyHook As cls_HookApi '自定义hook Sub Main() App.TaskVisible = False Set MyHook = New cls_HookApi MyHook.HookApi "ntdll.dll", "ZwOpenFile", GetFunAddr(AddressOf ZwOpenFileCallback), GetCurrentProcess Load frm_Main End Sub 'NtOpenFile回调 Public Function ZwOpenFileCallback(Filehandle As Long, ByVal DesiredAccess As Long, ObjectAttributes As OBJECT_ATTRIBUTES, IoStatusBlock As IO_STATUS_BLOCK, ByVal ShareAccess As Long, ByVal OpenOptions As Long) As Long Dim lRetVal As Long MyHook.HookStatus False 'Debug.Print ObjectAttrToName(ObjectAttributes) If LCase(ObjectAttrToName(ObjectAttributes)) Like LCase("*msi.dll") Then lRetVal = STATUS_OBJECT_NAME_NOT_FOUND '返回值改为对象不存在 Else lRetVal = ZwOpenFile(Filehandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions) End If MyHook.HookStatus True ZwOpenFileCallback = lRetVal End Function '得到文件名称 Private Function ObjectAttrToName(ObjectAttr As OBJECT_ATTRIBUTES) As String Dim bytCode() As Byte Dim dwName As Long Dim dwLength As Integer CopyMemory dwLength, ByVal ObjectAttr.ObjectName, 2 If dwLength > 0 Then CopyMemory dwName, ByVal ObjectAttr.ObjectName + 4, 4 ReDim bytCode(dwLength - 1) CopyMemory bytCode(0), ByVal dwName, dwLength ObjectAttrToName = StrConv(StrConv(bytCode, vbUnicode), vbFromUnicode) ObjectAttrToName = Replace(ObjectAttrToName, "\??\", "") End If Erase bytCode End Function Public Function GetFunAddr(lngFunAddr As Long) As Long GetFunAddr = lngFunAddr End Function Sub Unhook() Set MyHook = Nothing End Sub '类 Option Explicit Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long Private Declare Function GetCurrentProcess Lib "kernel32" () As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long) Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF Private mbytOldCode(5) As Byte Private mbytNewCode(5) As Byte Private mlngFunAddr As Long Private mhProcess As Long Public Function HookApi(ByVal strDllName As String, ByVal strFunName As String, ByVal lngFunAddr As Long, ByVal hProcess As Long) As Boolean Dim hModule As Long, dwJmpAddr As Long mhProcess = GetCurrentProcess hModule = LoadLibrary(strDllName) If hModule = 0 Then HookApi = False: Exit Function mlngFunAddr = GetProcAddress(hModule, strFunName) If mlngFunAddr = 0 Then HookApi = False: Exit Function CopyMemory mbytOldCode(0), ByVal mlngFunAddr, 6 mbytNewCode(0) = &HE9 dwJmpAddr = lngFunAddr - mlngFunAddr - 5 CopyMemory mbytNewCode(1), dwJmpAddr, 4 HookStatus True HookApi = True End Function Public Function HookStatus(ByVal blnIsHook As Boolean) As Boolean If blnIsHook Then If WriteProcessMemory(mhProcess, ByVal mlngFunAddr, mbytNewCode(0), 5, 0) <> 0 Then HookStatus = True '拦截 Else If WriteProcessMemory(mhProcess, ByVal mlngFunAddr, mbytOldCode(0), 5, 0) <> 0 Then HookStatus = False '恢复 End If End Function Private Sub Class_Terminate() HookStatus False End Sub '****完成****
附上前两种方法: 方法一:一句代码搞定: Open "msi.dll" For Binary Lock Read Write As #235 '自己定义文件号 方法二:使用API OpenFile或CreateFile(需完整路径) Private Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, lpReOpenBuff As Long, ByVal wStyle As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private hFile_Msi As Long Sub LockMsi() hFile_Msi = OpenFile("msi.dll", ByVal VarPtr(0&), &H10) 'Debug.Print hFile_Msi End Sub Sub UnLockMsi() If hFile_Msi > 0 Then CloseHandle hFile_Msi End Sub Sub Main() LockMsi '先锁定,再加载窗体 Load Form1 Form1.Show End Sub
#219
#220
Form_Load()中先初始化控件参数 WithMSComm1 .Settings="9600,N,8,1" .InputMode=1 '设置接受数据的类型是二进制类型数据 .InputLen=8 '一次性从接收缓冲区中读取所有数据(8个字节为一组) .InBufferCount=0 '清空接收缓冲区 .OutBufferCount=0 '清空发送缓冲区 .SThreshold=0 '一旦发送数据就触发OnComm()事件来检测是否返回数据 .RThreshold=1 '接收到1个字节数据就立即触发OnComm()事件 .CommPort=1 '使用第一个串口 .PortOpen=True '打开串口 EndWith
这是个很头痛的问题,3个月了,我一直想找出VB为什么接收缓冲区中可以接收很多字节,但是却不能一次性自动读出的问题。经过大量的实验!用过分次读出,单个读出的办法,感觉都很慢,没效率,分组读出的方法不好用于CANBUS组网,单个读出的方法,有时候处理过程中会丢失数据而且每个字节都触发事件,浪费资源!按网上的方法,加大过接收缓冲区,但是加到最大最大,还是不能一次读出20个数据,比原来增大了,还是不够用,对于小于16个的应该可以采用,也是个解决的办法,但是有局限性!
开始总想着是自己程序问题,学艺不精!后来在网上看到很多人也在研究这问题,看到他们的程序都没错,感觉不是人的问题,是这种com口控件自身的问题,由于串口已经快淡出历史舞台了,用的人也很少,只是有些工业机传输些少量的通讯数据而已!所以,估计不会引起软件公司的重视,有问题就有问题吧,没效益的事谁干?
个人拙见,应该是接收缓冲区没问题,问题在于MSComm1.RThreshold的设定值大于8以后不到设定值就提前触发MSComm1_OnComm()的动作或者乱动作,反正如果比成人的大脑就是神经错乱,不听话了!
所以我想了笨方法就是在MSComm1.RThreshold上设置小于8的值,我设成6,66大顺,哈哈,本人有点唯心哈!然后在MSComm1_OnComm()事件的MSComm1.Input前加延时,虽然笨,但是经过调试,感觉比分段读出,和单个读出效率多了,而且不会丢失数据,也不会产生分段读出在多个设备并网的情况下找错对象!我最多用到一次读出59个字节,如果字节多,不能一次读出,还可以增加延时,VB源程序代码如下:
Private Declare Sub Sleep Lib "kernel32 " (ByVal dwMilliseconds As Long) Private Sub CommInit() Call Commsetting(FirstCOM, FirstComSet) MSComm1.InputMode = 1 ' comInputModeBinary '//以二进制方式读数据 MSComm1.InputLen = 0 '//设置或返回一次从接收缓冲区中读取字节数,0表示一次读取所有数据 MSComm1.InBufferSize = 512 '//设置接收缓冲区512 Byte MSComm1.InBufferCount = 0 MSComm1.OutBufferSize = 512 '//设置发送缓冲区512 Byte MSComm1.OutBufferCount = 0 MSComm1.RThreshold = 6 'InputDataLen '//n个字符到接收缓冲区都触发接收事件 MSComm1.SThreshold = 0 'OutputDataLen End Sub Private Sub MSComm1_OnComm() Dim ComDATA() As Byte Dim temp As String Dim i As Integer On Error GoTo ErrOnCom If DisReceive = True Then Exit Sub End If Select Case MSComm1.CommEvent Case comEvReceive Sleep 100 ComDATA = MSComm1.Input For i = 0 To UBound(ComDATA) InputData(i) = ComDATA(i) Next i End Select End Sub
程序不全,只是中间截取,仅供参考
#221
#222
#223
刷新DNS缓存的方法一:
首先进入命令提示符下(开始——运行——cmd);
先运行:ipconfig /displaydns这个命令,查看一下本机已经缓存了那些的dns信息的,然后输入下面的命令
ipconfig /flushdns
这时本机的dns缓存信息已经清空了,我们可以再次输入第一次输入的命令来看一下,
ipconfig /displaydns
刷新DNS缓存的方法二:
直接禁用网卡再启用网卡,这样也可以
谷歌浏览器清除DNS缓存的方法
chrome://net-internals/#dns chrome://net-internals/#sockets
浏览器输入框执行,chrome需要粘贴后,需要在前面手打javascript:
因为粘贴的会自动过滤
javascript:document.body.contentEditable='true'; document.designMode='on'; void 0
https://www.app-superfast.com/zh/
SuperfastVPN为每个主要平台提供了一个安全,易于使用的VPN应用,并为所有您喜欢的设备提供了解决方案。
下载 适用于你的 SUPERFASTVPN
#224
#225
#226
#227
#228
The given payload is invalid.
问题:
使用EasyWeChat提示The given payload is invalid.
$user_info = $mp->encryptor->decryptData($session_key, $request->iv, $request->encryptedData);
EasyWechat 小程序获取手机号onGetPhoneNumber解密消息 有时会出现 The given payload is invalid. 数据无效。
解决方案:
获取用来生成 session_key 的 code 需要在获取 encryptedData 和 iv 之前就可以。
通俗一点,先让前端执行 wx.login () 拿到 code 了,再执行 getPhoneNumber 拿 encryptedData 和 iv