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 ...
随机推荐
- HTML-Ronoob-基础教程:HTML 字符实体
ylbtech-HTML-Ronoob-基础教程:HTML 字符实体 1.返回顶部 1. HTML 中的预留字符必须被替换为字符实体. HTML 实体 在 HTML 中,某些字符是预留的. 在 HTM ...
- jQuery的html和css
jQuery每次返回的都是当前的集合对象: 每个方法用的时候都会把他的元素对象返回,他每次返回的都是最近的那个元素: 1.addclass() 备选元素添加一个类名 2.removeclass() 移 ...
- ha环境下重新格式化hdfs报错
datanode启动不成功,如下所示,我的136,137.138都是datanode,都启动不了. 查看datanode日志文件发现报错: 一个报错Incompatible clusterIDs in ...
- ArcEngine 创建空间参考设置默认域
ISpatialReferenceFactory3 spatialReferenceFactory = new SpatialReferenceEnvironmentClass(); outSR = ...
- PHP正则配合写配置文件导致Getshell
PHP正则配合写配置文件导致Getshell,偶然间看到的一个题目, p 牛的小密圈的一个问题. 分析一下,漏洞代码: index.php <?php $str=addslashes($_GET ...
- 00007 - Linux时间date命令详解
1.命令:date 2.命令功能:date 可以用来显示或设定系统的日期与时间. 3.命令参数 -d<字符串>:显示字符串所指的日期与时间.字符串前后必须加上双引号: -s<字符串& ...
- sas 解析json
代码: proc ds2;data _null_; method init(); dcl package json j(); dcl int rc tokenType ...
- GAC 注册查看与删除
1.复制以下命令粘贴到以管理员权限运行的命令行程序里,回车运行(前提条件得有gacutil.exe注册工具): cd "C:\NETFX 4.0 Tools" 以windows7 ...
- idea vs
F8对应vs的F10F7对应vs的F11F9对应vs的F5 ctrl+.对应vs的alt+回车 shift+alt+s 查找文本的出现位置就用Ctrl+F/Ctrl+Shift+F在当前窗口或 ...
- pthread mutex
pthead_mutex_t mutex; 1:create: pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t ...