福建福州 李禾(email):我看了98.2期中的“关于怎样实现用VB编程控制I/O口", 觉得有些疑问,VB4.0企业版和VB5.0专业版中不是有一个控件Mscomm, 能否使用它来编写程序控制串口?如果可以,能否给出一个样例。谢谢!
李海:上次那个问题并未指出所要控制的I/O口是否是串口,所以我给出的是一个通用的解决方案,它可以读写用户指定的I/O口,这对于数据采集和其他许多场合 都是有用的。对于PC系统的串口(COM1-COM4),当然可以使用Mscomm来编写程序 进行控制。理论上,Mscomm控制可以支持多达16个控制,不过一般的计算机实际 上只有2个标准的COM口。对于非标准的串行口,Mscomm控件无能为力,只能采用上次所说的方法,当然,这很麻烦,因为要处理各种控制字和命令字。
现在,简要地介绍一下Vb的Mscomm控件,它实际是Crescent的PDQComm的一个子集,它包括了进行串行通信所需的最基本的要求。Vb中有两个例子Dialer和VBTerm 来介绍这个控件的用法。这两个例子在Vb 3.0和4.0的Samples\Vbterm目录中, 在Vb5.0的Samples\CompTool\Dialer和MSComm目录中。Dialer比较简单,就是演示 如何拨号。Vbterm稍微复杂一些,包括一些参数的设置和数据的接收,这个例子的 OnComm事件是核心。
西安.李波:贵刊上期“问与答”栏目中,有人问如何用VB编程控制I/O口,李海先生在回答中提拱了一段C++程序。我将该程序原样输入 后用VC编译成DLL文件,但在VB中调用时出现一个实时错误:找不到函数 Inport (DLL文件中的函数)的入口。我的声明语句 和调用过程均未出错,请问是什么原因?
李海:我想您大概不太熟悉C语言的Windows编程。如果DLL的函数可 以被Visual Basic或外部的EXE程序直接调用,那么这个函数必须是 输出(export)的,也就是必须对外部来说可见。为了实现这一点, 32位DLL在编译时必须在模块定义文件中加上相应的语句。具体到本例,你需要建立一个VBio32.def(假设你的DLL名为Vbio32.dll), 然后输入以下语句:
EXETYPE WINDOWS DESCRIPTION 'Visual Basic I/O -- Copyright(c) 1997, Hai Li' CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE EXPORTS Inport @1 InportW @2 Outport @3 OutportW @4EXPORTS后面的函数就是你要输出的函数,如果DLL的函数没有出现 在这里,它们不能在DLL外部调用。如果编写被32位Visual Basic 调用的DLL,它的两个基本条件是被调用的函数可输出和采用 stdcall方式。如果您重新阅读一下上次的程序,您会发现在每个 函数前有__stdcall修饰符,这就说明该函数采用stdcall方式。 你也可以在这里下载编译好的DLL。
如果您有任何建议,请给我发电子邮件:
。
版权所有 李海,热情软件屋 1997-2006