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 ...
随机推荐
- 在Ubuntu16.04下面安装asterisk网络电话交换机服务器
在Ubuntu下面需要安装 apt install libncurses5-dev uuid-dev libjansson-dev libxml2-dev libsqlite3-dev 去官网下载包h ...
- TensorFlow安装教程(ubuntu 18.04)
此教程的硬件条件: 1.Nvidia GPU Geforce390及以上 2.Ubuntu 18.04操作系统 3.Anaconda工具包 如果python版本为3.7及以上,使用如下命令降级到3.6 ...
- delphi正则表达式学习笔记(一)
在 Delphi 中是没有自带的正则表达式库的,在网上能找到的用于 Delphi 的正则表达式类大体上有两个,分别是 PerlRegEx 和 RegExpr. 前者相当强大,但发布程序时需要带上他的一 ...
- mysql中min和max查询优化
mysql max() 函数的需扫描where条件过滤后的所有行: 在测试环境中重现: 测试版本:Server version: 5.1.58-log MySQL Community ...
- mysql的DATE_FORMAT参数格式
mysql有个字段是DATETIME类型,要实现可以按月统计,该怎么写sql语句?select month(f1) from tt group by month(f1)or select DATE_F ...
- PHP:引用Phpword导出数据到word文档
下载地址https://www.cnwenhui.cn/html/show-597.html(其中有中文使用手册可以下载看看) 1.首先要下载Phpword类库,放在如下图目录下 2.调用方法 pub ...
- Java - 26 Java 数据结构
Java 数据结构 Java工具包提供了强大的数据结构.在Java中的数据结构主要包括以下几种接口和类: 枚举(Enumeration) 位集合(BitSet) 向量(Vector) 栈(Stack) ...
- 简单方法解决bootstrap3 modal异步加载只一次的问题
用过bootstrap3自身的modal的remote属性的人可能都有相同的疑惑:就是点击弹出modal后再次点击会从缓存中加载内容,而不会再次走后台,解决办法就是只要让modal本身的属性发生变化, ...
- Install Python on Mac (Anaconda)
Install Python on Mac (Anaconda) 标签(空格分隔): 运维 This blog is copy from the link: https://medium.com/@G ...
- java 获得系统当前时间
import org.junit.Test; import java.text.SimpleDateFormat; import java.util.Calendar; import java.uti ...