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 = 0

    ‘接收缓冲区大小
    msComm.InBufferSize = 1024

    ‘发送缓冲区大小
    msComm.OutBufferSize = 1024

    ‘一次发送所有数据,发送数据时不产生onComm()事件
    msComm.SThreshold = 0

    ‘接收1个字节长度触发OnComm()事件
    msComm.RThreshold = 1

    ‘清空接收缓冲区
    msComm.InBufferCount = 0

    ‘清空发送缓冲区
    msComm.OutBufferCount = 0

    ‘返回执行成功标识
    frm_initial_parameters = "[email protected]串口初始化成功"

Err:
    If Err.Number > 0 Then
        ‘返回错误消息
        frm_initial_parameters = "[email protected]" + "错误编号:" & 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 = "[email protected]串口打开成功"
Err:
    If Err.Number > 0 Then
        frm_open_serialport = "[email protected]" + "错误编号:" & 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 = 0

    ‘清空发送缓冲区
    msComm.OutBufferCount = 0

    ‘串口关闭
    msComm.PortOpen = False

    ‘返回执行成功标识
    frm_close_serialport = "[email protected]串口关闭成功"
Err:
    If Err.Number > 0 Then
        frm_close_serialport = "[email protected]" + "错误编号:" & 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 = 10
        Err.Description = "发送数据为空"
        GoTo Err
    End If

    ‘数据类型 0-16进制 1-字符串
    If inputmode = 0 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 = 0 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 = 0 To UBound(slz)
                byt(j) = Val("&H" & slz(j))
            Next j

            ‘发送数据
            msComm.Output = byt

            Sleep (inputtime)

            Erase byt
            Erase slz
        Next i

    ElseIf iniputmode = 1 Then
        msComm.Output = inputdata
        Sleep (inputtime)
    End If

    ‘返回执行成功标识
    frm_send_data = "[email protected]数据发送成功"
Err:
    If Err.Number > 0 Then
        frm_send_data = "[email protected]" + "错误编号:" & 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 = 0) Then
        ‘16进制数据接收
        Select Case msComm.CommEvent
            Case comEvReceive
                ‘接收16进制数据
                strBuff = msComm.Input
                str() = strBuff

                For k = 0 To UBound(str)
                    If Len(Hex(str(k))) = 1 Then
                        strdata = strdata & "0" & 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 = 1) Then
        ‘文本数据接收
        strRest = msComm.Input
    End If

    If (strRest = "") Then
        Err.Number = 11
        Err.Description = "接收数据为空值"
        GoTo Err
    End If

    ‘返回执行成功标识
    frm_receive_data = "[email protected]" & strRest
Err:
    If Err.Number > 0 Then
        frm_receive_data = "[email protected]" + "错误编号:" & 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

 

原文地址:https://www.cnblogs.com/ricoo/p/10039981.html

时间: 2024-10-07 17:10:57

VB-创建类模块DLL文件的相关文章

DLL文件无法删除怎么解决

dll文件你听说过吗?那怎样把那些删不掉的东西删掉呢?请看.... 老听网友说某某文件删不掉啊.之类的.而且有很多都是dll文件.删除的时候总是提示,"正在使用"或者是"拒绝访问权"等等之类的. 虽然解决这个问题的方法有很多种.而且也可以把他删除,但是网友们有没有想过是为什么删不掉呢??这是因为你运行的某个程序正在调用这个dll文件.正在使用的文件是当然不可能给你删除的.那么,到底是哪个程序在调用这个dll文件呢.我教大家一个方法可以把那个程序很容易的找出来..  

python_way.day7 模块(configparser,xml,shutil,subprocess)、面向对象(上)(创建类,类的构成,函数式编程与面向对象编程的选择,类的继承)

python_way.day7 1.模块 configparser,xml,shutil,subprocess 2.面向对象(上) 创建类,类的构成,函数式编程与面向对象编程的选择,类的继承 1.模块 configparser 用于处理特定格式的文件,其本职上使用open来操作,只能是  [test1] 特定的格式 [test1] k1 = 123 k2 = True [test2] k1 = 123 k2 = v1 文件内容 1.获取 import configparser #打开文件找到文件

DLL中__declspec(dllexport)和.def(模块定义文件)定义导出函数的一点区别

原想是不在DLL中使用.def文件的,直接在需要导出的函数前加__declspec(dllexport)修饰.但在是要导出STDAPI __declspec(dllexport) DllGetClassObject的时候,就提示"warning C4518: “__declspec(dllexport ) ” : 此处遇到意外的存储类或类型说明符:被忽略"(我用的是vc.net 2003). STDAPI这个宏扩展出来是extern "C" HRESULT __st

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

看网上的好多关于QT调用Dll的方法,大部分都是调用函数的,并没有调用C++类成员的情况,即使是有,比如说: 使用Qt编写模块化插件式应用程序 Qt 一步一步实现dll调用(附源码)---(这一篇里没有调用类成员的) Qt调用dll中的功能函数 ?我就是按照这上面的教程一步步做的,可惜了都没成功~~~这里面都有一个最重要的步骤没有说清楚(可能怪我笨~~),路径问题!!! 所以这里自我做一下总结: 创建时选择C++ Library就可以了,然后选择Shared Library(共享库),其他默认O

VBA类模块--创建Table类(1)

VBA开发接触了两个月,自认为拜托了新手期,遇到很多问题,也有一些心得.根据开发中遇到的问题开始陆续总结. 开发过程中,遇到程序运行过程中的存储大量临时数据问题,这些数据只是用于下一步的计算,不需要呈现在最后的结果中.为了后面步骤使用和管理方便,创建了Table类模块. 类模块:CTable 1 Option Explicit 2 3 '==================================== 4 '名称: CTable 5 '功能: 描述一个Excel表格区域 6 '=====

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

在VB中,属性是可以有参数的 -- 即: VB的语法,使用参数的不一定是方法,也有可能是属性!(虽然属性的本质是方法) 例一:参数当作"索引"使用 定义一个类模块,模块名称Ints.为简化模型,使用了只读属性. 1 Private arr(3) As Integer 2 3 Public Property Get ArrValue(Index As Integer) As Integer 4 ArrValue = arr(Index) 5 End Property 6 7 '初始化ar

利用MyEclipse自动创建PO类、hbm文件(映射文件)、DAO

前提条件:表sjzdfl  表sjzdxx (使用数据库MySQL) 表sjzdfl (两个字段sjzdflId 和 sjzdflmc) 表sjzdfl 建表语句: [sql] view plaincopy DROP TABLE IF EXISTS `sjzdfl`; CREATE TABLE `sjzdfl` ( `sjzdflId` int(11) NOT NULL auto_increment, `sjzdflmc` varchar(255) default NULL, PRIMARY K

C# 中如何将一个类文件(XX.CS)封装成.dll文件

C# 中如何将一个类文件(XX.CS)封装成.dll文件 Visual Studio Tools------> Visual Studio 2010命令提示 输入以下命令:csc /t:library /out:c:\XXX.dll c:\XXX.cs 其中c:\XXX.cs 为要生成的cs文件:c:\XXX.dll为生成的dll文件

C#加载dll 创建类对象

//加载dll 创建类对象string sqlightAssembly = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "system.data.sqlite.dll"); Assembly lib = Assembly.LoadFrom(sqlightAssembly); foreach (Type t in lib.GetExportedTypes()) { if(t.FullName == "System.Da