Chinaunix首页 | 论坛 | 博客
  • 博客访问: 445809
  • 博文数量: 403
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: -70
  • 用 户 组: 普通用户
  • 注册时间: 2016-09-05 12:45
文章分类

全部博文(403)

文章存档

2014年(3)

2013年(1)

2012年(3)

2011年(21)

2010年(13)

2009年(64)

2008年(9)

2007年(36)

2006年(253)

分类: 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.

Keywords: Windows; Dynamic Link Library; Input/Out port 

一、引言

作为一种简单易用的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 LibMainHINSTANCE hInstanceWORD wDataSegWORD               wHeapSizeLPSTR 1pszCmdLine{

   ifwHeapSize=0//使局部堆、数据段可移动

   UnlockData0);  //解锁数据段

   /*此处可进行一些用户必要的初始化工作*/

   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)           DOSPATH所指出的任何目录;

(3)           程序所在的目录;

不论用何种语言对编译好的DLL进行调用时,基本上都有两种调用方式,一种是显示的调用,一种是隐式的调用。

1、显式调用,不需要在工程中加入导入库和相应的头文件,只需要把动态库放在指定的目录下.。在应用程序中通过函数调用。显式的装载和卸掉DLL,通过函数指针来调用DLL的导出函数。

步骤:

1)        调用LoadLibraryMFC提供的AfxLoadLibrary显式的将自己所做的动态连接库调进来,动态连接库的文件名是上两面两个函数的参数;

2)        再用GetProcAddress()获取想要引入的函数的指针;

3)        用这个函数的指针调用该函数。这样,你就象使用本应用程序自定义的函数一样来调用此引用函数了;

4)        在应用程序退出之前,应该用FreeLibrary MFC 提供的AFXLoadLibrary释放动态连接库。

2、隐式的调用:则需把产生动态连接库时产生的.LIB文件加入到应用程序的工程中,想使用DLL中的函数时,只需说明一下。

三、端口读写I/ODLL源代码

//.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 LibMainHINSTANCE hInstanceWORD wDataSegWORD wHeapSizeLPSTR 1pszCmdLine

{

ifwHeapSize=0//使局部堆、数据段可移动

UnlockData0);  //解锁数据段

/*此处可进行一些用户必要的初始化工作*/

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
下载: 下载

阅读(3868) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~