VB-创建类模块DLL文件
最近需要调用MSCOMM32.OCX控件,但是ABAP调用过程中发现无法同时发送多条记录,则需调整实现方式:
a.创建DLL文件封装MSCOMM控件相关属性及方法
b.系统注册DLL文件
c.ABAP调用DLL文件相关属性及方法
这一部分内容主要是将VB类模块的创建过程记录下:
1.打开VB,创建ActiveX DLL文件

2.修改工程名为MSCommPrj

3.修改类模块名称为msCommCls

4.引用MSCOMM32.OCX组件
菜单:工程->引用->浏览

查找MSCOMM32.OCX文件(C:\Windows\System32 或者 C:\Windows\SysWOW64)


控件引用完成
5.类模块创建Function
'********************************
'串口通信集成
'1.初始参数
'2.打开串口
'3.关闭串口
'4.发送数据
'5.接收数据
'********************************* '类定义
Dim msComm As New MSCommLib.msComm
'声明
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '初始参数
Public Function frm_initial_parameters(ByVal commport As Integer, ByVal setting As String, ByVal inputmode As Integer) As String
On Error GoTo Err
'串口
msComm.commport = commport '参数:波特率 校验 数据位 停止位
msComm.Settings = setting '设置接收数据类型:二进制comInputModeBinary-0 字符串comInputModeText-1
msComm.inputmode = inputmode '一次从接收缓冲区读取所有数据(8字节一组)
msComm.InputLen = '接收缓冲区大小
msComm.InBufferSize = '发送缓冲区大小
msComm.OutBufferSize = '一次发送所有数据,发送数据时不产生onComm()事件
msComm.SThreshold = '接收1个字节长度触发OnComm()事件
msComm.RThreshold = '清空接收缓冲区
msComm.InBufferCount = '清空发送缓冲区
msComm.OutBufferCount = '返回执行成功标识
frm_initial_parameters = "S@串口初始化成功" Err:
If Err.Number > Then
'返回错误消息
frm_initial_parameters = "E@" + "错误编号:" & Err.Number & " 错误描述:" & Err.Description
Exit Function
Resume Next
End If
End Function '打开串口
Public Function frm_open_serialport() As String
On Error GoTo Err
'串口打开
msComm.PortOpen = True '返回执行成功标识
frm_open_serialport = "S@串口打开成功"
Err:
If Err.Number > Then
frm_open_serialport = "E@" + "错误编号:" & Err.Number & " 错误描述:" & Err.Description
Exit Function
Resume Next
End If
End Function '关闭串口
Public Function frm_close_serialport() As String
On Error GoTo Err
'清空接收缓冲区
msComm.InBufferCount = '清空发送缓冲区
msComm.OutBufferCount = '串口关闭
msComm.PortOpen = False '返回执行成功标识
frm_close_serialport = "S@串口关闭成功"
Err:
If Err.Number > Then
frm_close_serialport = "E@" + "错误编号:" & Err.Number & " 错误描述:" & Err.Description
Exit Function
Resume Next
End If
End Function '发送数据
Public Function frm_send_data(ByVal inputmode As Integer, ByVal inputtime As Integer, ByVal inputdata As String) As String
Dim rst As String
On Error GoTo Err
'发送数据检查
If inputdata = "" Then
Err.Number =
Err.Description = "发送数据为空"
GoTo Err
End If '数据类型 0-16进制 1-字符串
If inputmode = Then
Dim ztm As Integer
Dim spt() As String
Dim slz() As String
Dim byt() As Byte '根据符号 & 拆解字符串
spt = Split(inputdata, "&") '发送数据条目数
ztm = UBound(spt) '循环条目分批发送数据
For i = To ztm
'字符串前后空格
spt(i) = LTrim(spt(i))
spt(i) = RTrim(spt(i)) '16进制按照空格拆解为Byte[]数组
slz = Split(spt(i), " ") '重定义数组大小Byte[]
ReDim byt(UBound(slz)) For j = To UBound(slz)
byt(j) = Val("&H" & slz(j))
Next j '发送数据
msComm.Output = byt Sleep (inputtime) Erase byt
Erase slz
Next i ElseIf iniputmode = Then
msComm.Output = inputdata
Sleep (inputtime)
End If '返回执行成功标识
frm_send_data = "S@数据发送成功"
Err:
If Err.Number > Then
frm_send_data = "E@" + "错误编号:" & Err.Number & " 错误描述:" & Err.Description
Exit Function
Resume Next
End If
End Function '接收数据
Public Function frm_receive_data(ByVal inputmode As Integer) As String
On Error GoTo Err
Dim strRest As String
Dim strBuff As String
Dim strdata As String
Dim str() As Byte If (inputmode = ) Then
'16进制数据接收
Select Case msComm.CommEvent
Case comEvReceive
'接收16进制数据
strBuff = msComm.Input
str() = strBuff For k = To UBound(str)
If Len(Hex(str(k))) = Then
strdata = strdata & "" & Hex(str(k))
Else
strdata = strdata & Hex(str(k))
End If
Next
End Select If rst = "" Then
strRest = strdata
Else
strRest = strRest & " " & strdata
End If
ElseIf (inputmode = ) Then
'文本数据接收
strRest = msComm.Input
End If If (strRest = "") Then
Err.Number =
Err.Description = "接收数据为空值"
GoTo Err
End If '返回执行成功标识
frm_receive_data = "S@" & strRest
Err:
If Err.Number > Then
frm_receive_data = "E@" + "错误编号:" & Err.Number & " 错误描述:" & Err.Description
Exit Function
Resume Next
End If
End Function
6.工程保存并编译成DLL文件
文件保存 菜单:文件->保存工程
文件编译 菜单:文件->生成MSCommPrj.dll
7.DLL类测试
注册DLL文件:运行CMD->Regsvr32 DLL文件路径
打开VB,创建标准EXE

窗体元素布局

调用DLL类方法
Dim mscls As New MSCommProject.MSCommCls
Dim rst As String Private Sub close_Click()
'关闭串口
rst = mscls.frm_close_serialport
RText.Text = rst + vbCrLf + RText.Text
End Sub Private Sub Form_Load()
'初始参数
rst = mscls.frm_initial_parameters(commport.Text, setting.Text, inputmode.Text)
RText.Text = rst + vbCrLf + RText.Text End Sub Private Sub open_Click()
'打开串口
rst = mscls.frm_open_serialport
RText.Text = rst + vbCrLf + RText.Text
End Sub Private Sub send_Click()
'发送数据
rst = mscls.frm_send_data(inputmode.Text, SText.Text)
RText.Text = rst + vbCrLf + RText.Text
End Sub
VB-创建类模块DLL文件的更多相关文章
- DLL文件无法删除怎么解决
dll文件你听说过吗?那怎样把那些删不掉的东西删掉呢?请看.... 老听网友说某某文件删不掉啊.之类的.而且有很多都是dll文件.删除的时候总是提示,"正在使用"或者是" ...
- DLL模块:C++在VS下创建、调用dll
1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...
- 解决IDEA创建多模块项目找不到创建class类的问题
最近在利用idea创建一个多模块的java项目,但是让人十分抓狂的事,模块竟然找不到创建class类的选项,如图 前提:创建模块后假如右下角出现 务必要点击import Changes .然后看下是否 ...
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
XML序列化 #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...
- QT创建与调用Dll方法(包括类成员)--显式调用
看网上的好多关于QT调用Dll的方法,大部分都是调用函数的,并没有调用C++类成员的情况,即使是有,比如说: 使用Qt编写模块化插件式应用程序 Qt 一步一步实现dll调用(附源码)---(这一篇里没 ...
- C# 怎么把类文件如(XXX.cs)转为dll文件
打开VS2012或2017 ,新建项目,选择 类库(.NET Framework),创建好一个项目 在建好的项目中添加需要转的类文件 然后将项目重新生成后,在项目的Debug下就可以找到对应的dll ...
- Dll文件的创建与测试C#
创建Dll文件 首先使用VS 2019创建Dll项目,创建项目时选择"类库",如下图 在项目中创建类文件,添加测试代码: namespace PlantSim_C_Interfac ...
- VB类模块中属性的参数——VBA中Range对象的Value属性和Value2属性的一点区别
在VB中,属性是可以有参数的,而VBA中属性使用参数非常常见.比如最常用的:Worksheet.Range("A1:A10") VB的语法,使用参数的不一定是方法,也有可能是属性 ...
- delphi 创建DBASE和FOXPRO两类DBF数据文件的差异
delphi 创建DBASE和FOXPRO两类DBF数据文件的差异,主要有几点: 1.创建方法不同 DBASE的创建方法: Self.Table1.Close; Self.Table1.Active ...
随机推荐
- Linux下设置固定IP的方法
本文转自http://blog.163.com/liulina_517@126/blog/static/3766198320118231431594/ linux系统安装完,以后通过命令模式配置网卡I ...
- go语言学习--map中键值得删除
测试 map1 中是否存在 key1: 在例子 8.1 中,我们已经见过可以使用 val1 = map1[key1] 的方法获取 key1 对应的值 val1.如果 map 中不存在 key1,val ...
- rnn实现三位数加法的训练
#!/usr/bin/env python # coding=utf-8 from keras.models import Sequential from keras.layers import Ac ...
- [UE4]使用另一个相机Scene Capture Component 2D当小地图
挂一个相机(Scene Capture Component 2D)在人物角色的正上方,相机朝下,让UI上的某一块区域看到相机所显示的内容. 一.在人物角色正上方添加相机组件Scene Capture ...
- MySQL 删除重复数据实例
如何删除重复数据 业务场景:删除评论表中对同一订单同一商品的重复评论,只保留最早的一条. 查看是否存在对于同一订单同一商品的重复评论. SELECT order_id,product_id,COUNT ...
- 2018/11/5 每日分析-test
郑醇1901,M30向上一笔中,只是看起来不太值得做,主要因为现在30分钟向上一笔空间无法判定,未必能上去(M5中枢如果向上突破并且不背驰才可能有机会:如果直接下去或者向上后背驰,那么这里就只是一个M ...
- fastle
昨晚梦见日本和中国打仗, 发过来了很多导弹, 但是飞行速度很慢, 我还能看到上面的辐射三角号 之后我就趴在地上躲导弹 然后感觉身体被蒸发, 意识逐渐模糊, 就醒了 attack大爷的休闲(修仙)题 感 ...
- Python ————反射机制
python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...
- 模拟python中的Yield伪并发
并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. #Yield伪并发 _author_= ...
- Java并发编程中的相关注解
引自:http://www.cnblogs.com/phoebus0501/archive/2011/02/21/1960077.html Java并发编程中,用到了一些专门为并发编程准备的 Anno ...