全部博文(403)
分类: C/C++
2006-09-15 20:16:13
用VC制作动态连接库
Dynamic Link Library made With Visual C++
唐山职业技术学院 王艳
[摘要]本文论述了用VC制作动态连接库的注意问题和方法,并给出了检测与控制I/O口的应用实例。
[关键词] Windows开发环境;DLL动态连接库;I/O口
Abstract: This article discusses several considerable details and methods of making Dynamic Link Library with Visual c++. An example of application about inspecting and controling Input/Out port is given.
一、引言
作为一种简单易用的Windows开发环境,VB从一推出就受到了广大编程人员的欢迎。它使程序员不必再直接面对着纷繁复杂的Windows消息,而可以将精力主要集中在程序功能的实现上,大大提高了编程效率。VB中高度的封装和模块化减轻了编程者的负担,同时也使开发人员失去了许多访问低层API函数和直接与Windows交互的机会。对硬件的控制和低级操作等方面显得力不从心。但是,在VB中可以通过调用Win32API函数,或程序员自己用C/C++等开发一些动态连接库,用于在VB中调用,来完成VB中不可能完成的事,大大增强了VB的编程能力。
二、DLL的建立和调用
(一)、DLL的建立。关于DLL的建立,有以下几个方面的要素是不可缺少的:
1、 入口函数LibMain()
就象C程序中的WinMain()函数一样,Windows每次加载DLL时都要执行LibMain()函数,主要用来进行一些初始化工作。通常的形式是:
int FAR PASCAL LibMain(HINSTANCE hInstance,WORD wDataSeg,WORD wHeapSize,LPSTR 1pszCmdLine){
if(wHeapSize!=0)//使局部堆、数据段可移动
UnlockData(0); //解锁数据段
/*此处可进行一些用户必要的初始化工作*/
return 1;
}
2、 出口函数WEP()
Windows从内存中卸载DLL时,调用相应的出口函数WEP(),主要做一些清理工作。如释放站用的内存资源;丢弃某些字串、位图等资源;关闭打开的文件等等。
3、 自定义的输出函数
为了让位于不同内存段的应用程序进行远程调用,自定义的输出函数必须定义为远程函数(使用FAR关键字),以防使用近指针而得到意外的结果;同时,加上PASCAL关键字可加快程序的运行速度,使代码简单高效,提高程序的运行速度。
4、 输出函数的引出方法
1)、在DLL的模块定义文件中(.DEF)由EXPORTS语句对输出函数逐一列出。例如:
EXPORTS WEP @1 residentname
PortIn @2
PortOut @3
2)、在每个输出函数定义的说明中使用_export关键字来对其引出.
以上两种方法任选其中的一种即可,不可重复。
(二)、调用DLL的方法
通常我们在调用DLL时所需的DLL文件必须在以下三个目录之一:
(1) Windows的系统目录:\windows\system;
(2) DOS中PATH所指出的任何目录;
(3) 程序所在的目录;
不论用何种语言对编译好的DLL进行调用时,基本上都有两种调用方式,一种是显示的调用,一种是隐式的调用。
1、显式调用,不需要在工程中加入导入库和相应的头文件,只需要把动态库放在指定的目录下.。在应用程序中通过函数调用。显式的装载和卸掉DLL,通过函数指针来调用DLL的导出函数。
步骤:
1) 调用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态连接库调进来,动态连接库的文件名是上两面两个函数的参数;
2) 再用GetProcAddress()获取想要引入的函数的指针;
3) 用这个函数的指针调用该函数。这样,你就象使用本应用程序自定义的函数一样来调用此引用函数了;
4) 在应用程序退出之前,应该用FreeLibrary 或MFC 提供的AFXLoadLibrary释放动态连接库。
2、隐式的调用:则需把产生动态连接库时产生的.LIB文件加入到应用程序的工程中,想使用DLL中的函数时,只需说明一下。
三、端口读写I/O的DLL源代码
//.DEF文件
LIBRARY PORTDLL ;指出DLL的名字
DESCRIPTION ‘DLL FOR PORT _IN_OUT’ ;描述DLL用途
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCADABLE
DATA PRELOAD MOVEABLE SINGLE
HEAPSIZE 1024
//.CPP文件
#include
#include
int FAR PASCAL LibMain(HINSTANCE hInstance,WORD wDataSeg,WORD wHeapSize,LPSTR 1pszCmdLine)
{
if(wHeapSize!=0)//使局部堆、数据段可移动
UnlockData(0); //解锁数据段
/*此处可进行一些用户必要的初始化工作*/
return 1;
}
int FAR PASCAL _export PortOut(int port ,unsigined char value)
{
outp(port ,value);
return 1;
}
int FAR PASCAL _export PortIn(int port)
{
int result;
result=inp(port);
return (result);
}
int FAR PASCAL _export WEP(int nParam)
{
return 1;
}
将.DEF 文件和.CPP文件组成一个.PRG 文件,并进行编译连接成.EXE或.DLL文件就可以在应用程序中多其进行调用。
四、结束语
在上面,我们利用DLL技术方便地实现了Windows环境下对端口的直接访问,实现了对设备的直接检测和控制。
文件:
用vc开发动态链接库.chm
大小:
475KB
下载:
下载