最近需要调用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文件的更多相关文章

  1. DLL文件无法删除怎么解决

    dll文件你听说过吗?那怎样把那些删不掉的东西删掉呢?请看.... 老听网友说某某文件删不掉啊.之类的.而且有很多都是dll文件.删除的时候总是提示,"正在使用"或者是" ...

  2. DLL模块:C++在VS下创建、调用dll

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  3. 解决IDEA创建多模块项目找不到创建class类的问题

    最近在利用idea创建一个多模块的java项目,但是让人十分抓狂的事,模块竟然找不到创建class类的选项,如图 前提:创建模块后假如右下角出现 务必要点击import Changes .然后看下是否 ...

  4. XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)

    XML序列化   #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...

  5. QT创建与调用Dll方法(包括类成员)--显式调用

    看网上的好多关于QT调用Dll的方法,大部分都是调用函数的,并没有调用C++类成员的情况,即使是有,比如说: 使用Qt编写模块化插件式应用程序 Qt 一步一步实现dll调用(附源码)---(这一篇里没 ...

  6. C# 怎么把类文件如(XXX.cs)转为dll文件

    打开VS2012或2017 ,新建项目,选择  类库(.NET Framework),创建好一个项目 在建好的项目中添加需要转的类文件 然后将项目重新生成后,在项目的Debug下就可以找到对应的dll ...

  7. Dll文件的创建与测试C#

    创建Dll文件 首先使用VS 2019创建Dll项目,创建项目时选择"类库",如下图 在项目中创建类文件,添加测试代码: namespace PlantSim_C_Interfac ...

  8. VB类模块中属性的参数——VBA中Range对象的Value属性和Value2属性的一点区别

    在VB中,属性是可以有参数的,而VBA中属性使用参数非常常见.比如最常用的:Worksheet.Range("A1:A10")  VB的语法,使用参数的不一定是方法,也有可能是属性 ...

  9. delphi 创建DBASE和FOXPRO两类DBF数据文件的差异

    delphi 创建DBASE和FOXPRO两类DBF数据文件的差异,主要有几点: 1.创建方法不同 DBASE的创建方法: Self.Table1.Close; Self.Table1.Active ...

随机推荐

  1. springboot(整合多数据源demo,aop,定时任务,异步方法调用,以及获取properties中自定义的变量值)

    有这么一个需求 每个部门,需要操作的数据库不同,A部门要将数据放test数据库,B 部门数据 要放在test1数据库 同一个项目 需要整合 多个数据源 上传个demo 方便自己以后回看!!!!!!!! ...

  2. HDOJ 2004 成绩转换

    #include<cstdio> #include<iostream> using namespace std; int main() { int score; while ( ...

  3. Postman模拟ajax请求 并模拟登陆

    2.设置header头 <span style="font-size:16px;">设置代理.cookie.X-Requested-With   注意 :X-Reque ...

  4. BCGcontrolBar(八) Ribbon图标变换

    点击前 点击后 CBCGPRibbonButton *pRibbonBtn=NULL; pRibbonBtn=DYNAMIC_DOWNCAST(CBCGPRibbonButton,m_pFrame-& ...

  5. java运行原理剖析

    java是一种编译型语言,我们开发好的代码是不能够直接运行的,需要我们程序员进行编译之后,将字节点文件载入jvm虚拟之后,才可以运行操作 其原理是 java源代码-------编译-------> ...

  6. supervisor管理hive metastore和hive server2进程

    1. hive_metastore.ini [program:hive_metastore] environment = JAVA_HOME=/usr/java/jdk1..0_172-amd64,H ...

  7. mysql表操作与权限操作

    修改表ALTER TABLE 语法: . 修改表名 ALTER TABLE 表名 RENAME 新表名; . 增加字段 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ...

  8. WEBPAKC2.0开始

    1.创建一个webpack项目 mkdir webpack-demo &&cd webpack-demo npm init -y npm install --save-dev webp ...

  9. 《马哥出品高薪linux运维教程》wingkeung学习笔记-linux基础入门课程

    计算机原理概念: 1.CPU和内存中的存储单元通信线路称为总线(BUS),总线是被指令和数据复用的,所以也称为前端总线. 2.计算机中计算频率的时间标准即晶体振荡器原理,精确计算时间长度,根据相同的时 ...

  10. Android Studio连接不到MuMu模拟器;

    网易推出的mumu模拟器还挺好用的,主要是流畅占内存小: 但是安装mumu模拟器后,as连接不到mumu模拟器: 好了,教程来了:两步走: 先把模拟器运行起来! 第一步:打开Terminal,输入:  ...