三、编写DLL
创建一个DLL应包括三个基本成分。
其一是,Libmain函数,它是Windows DLL的入口点,主要用来完成一些初始化任务。
其二是,出口函数WEP。Windows的DLL必须包含一个标准的出口函数。在DLL最终卸出之前,Windows调用该函数作一些必要的清除工作(如释放一些资源等)。
其三是,自己的功能函数。
Windows95下VB编写的程序是32位的,与之对应的DLL也应是32位的。对于32位的DLL,16位DLL中的入口函数LibMain、退出函数WEP被DLLEntryPoint所代替。DLLEntryPoint入口和退出两个函数服务。在每次装入或卸下DLL时,Windows95调入DLLEntryPoint.
在VC++5.0中选择File|New,在New对话框中选择Project WorkSpace,再在New Project Workspace对话框中选择Dynamic-Link Library选项,并输入工程项目名,即可生成动态链接库的工作框架。
笔者利用VC++5.0开发的DLL的完整的程序清单如下:
∥DLL源文件I098.CPP
#include <windows.h>
#include<conio.h>
int FAR PASCAL outport(unsigned)
short sport);
int FAR PASCAL outport(unsigned short port,int databyte);
∥D11EntryPoint函数
BOOL WINAPI D11EntryPoint
(HINSTANCE hD11,
DWORDdwReason,
LPVOID Reserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
{
break;
}
case DLL_PROCESS_DETACH:
{
break;
}
}
return TRUE;
}
∥两个功能函数
int FAR PASCAL outport(unsigned short port)
{
reture(_inp(prot);
}
int FAR PASCAL inport(unsigned short port,int databyte)
{
int a;
a=_outp(port,databyte);
return a;
}
∥模块定义文件I098.DEF
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD SINGLE
EXPORTS
inport
outport
四、在VB中使用DLL
DLL函数或过程必须在全局模块(*.BAS)中正确说明才有效。VB是用Declare语句把一个DLL函数引入VB中的,它告诉VB在哪里找到DLL函数,并且让VB知道DLL需要哪种类型的参数,同时返回哪种类型的值。当某个DLL函数用Declare语句正确声明以后,就可以像使用其它函数一样使用这个DLL函数。
在VB应用程序的全局模块中声明I098.DLL并将其放入Windows\system目录下,这样就可以向使用Windows API一样使用I098中的inport和outport函数了。
Declare Function inport Lib“io98.d11”
(ByVal prot As Integer)As Long
Declare Function outport Lib“io98.d11”
(ByVal port As Integer,ByVal
databyte As Long)As Long
下面的程序示范了使用I098中的intport和outport函数。
Private Sub 输入_Click
X=inport(&H300)
Print x
End Sub
Private Sub输出_Click
x=outport(&H300,&HF)
Print x
End Sub
笔者曾在多套采用VB开发的计算机测控系统中使用这种方法,在一套车辆自动化管理系统开发过程中,笔者成功地采用上述DLL从研华PCL-722板上读取数字信号;在另一套加热炉的控制系统中,笔者成功地采用上述DLL从研华PCL-812PG板上读取1—5V的模拟信号。
五、结束语
以上介绍了编写32位DLL(即WIN32DLL)的一个实例,很好的解决了VB对硬件的访问的不足,实现了VB的实时数据采集,扩展了VB的功能。读者可通过本文所介绍的方法来编写自己的WIN32DLL,为自己开发的Windows95应用程序服务,不仅限于实时数据采集。除VB外,在DELPHI、Foxpro或其它类似条件下也可使用这种方法
评论 {{userinfo.comments}}
{{child.content}}
{{question.question}}
提交