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 ...
随机推荐
- python之路——2
王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 复习 1.编译型:一次性将全部的代码编译成二进制文件 c c++ 优点:运行效率高 缺点:开发速度慢,不能跨 ...
- [UE4]动态改变相机OrthWidh、关掉阴影
在制作缩略图的时候,每次都要手动不断尝试合适的OrthWidh,很是麻烦. 一.使用蓝图实现鼠标滚动动态改变OrthWidh.Get Ortho Width,Set Ortho Width 二.去掉阴 ...
- [UE4]隐藏对象Set Visibility
Propagate to Children:是否遍历子对象(用来设置子对象可见性)
- mysql为什么要分库分表?
1 基本思想之什么是分库分表?从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上. 2 基本思想之为什么要分库分表? 单表操作数据量有最优值, ...
- [电脑知识点]Excel取消受保护视图
- python学习笔记-学习大纲
- 【Selenium-WebDriver自学】Selenium测试设计技术(十三)
Selenium页面对象模型 1.Selenium页面对象模型 优点 页面的对象模型是其中测试对象和功能被彼此分开,从而保持代码干净的实现. 对象保持独立的测试脚本.一个目的可以通过一个或多个测试脚本 ...
- Python : 什么是*args和**kwargs[转载]
例子 def foo(*args, **kwargs):print 'args = ', argsprint 'kwargs = ', kwargsprint '------------------- ...
- Linux的用户
添加用户 添加删除用户 # useradd user # passwd user Changing password for user user. New password: BAD PASSWORD ...
- day6--面向对象初识
一面向过程与面向对象 面向过程: 流水线式的思维,顺着流程进行下去,类似于代码的堆叠,重视步骤 优点:不需要考虑太多东西,想到一个功能就写一个功能,堆叠代码 缺点:过程往往是先后执行的,要想变换功能或 ...