用API写的VB6 的串口类,出现“遇到问题需要关闭”

来源:互联网 发布:淘宝联盟插件 编辑:程序博客网 时间:2024/06/16 23:36
API写了个VB6 的类mycomm(环境是WinXP2 + VB6 sp6 rev6.0.9782),在Sub Main()读写串口下一切正常!不管是调试,还是编译运行都好好的。

将这个类加入到一个现有的、带有窗体的VB6工程中后,运行程序,读写串口绝大时候都正常!
可是就在退出程序时十次有七八次都(不是总是)出现“遇到问题需要关闭。我们对此引起的不便表示抱歉”这样的错误。
如果将调用mycomm的代码注释后,再运行就没问题了。

网上找了一天,没解决。结果今天自己搞定了,HOHO!
原来是在类初始化时用 GlobalAlloc();类终止时用了 GlobalFree() 引起的!

不用这个方法,改成定义动态数组就可以了。如:
Private m_buffIn() As Byte

相关的API声明中参数类型改成Byte:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Byte, Source As Byte, ByVal length As Long)
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Byte, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Byte, ByVal nNumberOfBytesToRead As Long, lpnBytesRead As Long, lpOverlapped As Any) As Long

调用时形如:
Redim m_buffIn(0 to 1024)
Call CopyMemory(buffInput(0), m_buffIn(0), nBytesRead)

附:之前还遇到过下面的错误(出自http://hi.csdn.net/tipfoo):
“0x????????”指令引用的“0xc0000005”内存。该内存不能为“read”。
“0x????????”指令引用的“0x????????”内存,该内存不能为“written”。
解决:传递的字符串参数值末尾加 Chr(0)。