当前位置:首页 > 全部子站 > IT > 思科认证

Windows下DLL编程技术及应用

来源:长理培训发布时间:2017-12-22 10:09:25

 百度广告

一 、引 言 
  因为Windows具有"与设备无关"的特性,不提倡与机器底层的东西打交道,如果直接用Windows的 API函数或I/O读写指令进行访问和操作,程序运行时往往就会产生保护模式错误甚至死机,更严重的情况会导致系统崩溃。那么在Windows下怎样方便地解决上述问题呢?用DLL(Dynamic Link Libraries)技术就是良好途径之一。

  DLL是Windows最重要的组成要素,Windows中的许多新功能、新特性都是通过DLL来实现的,因此掌握它、应用它是非常重要的。其实  Windows本身就是由许多的DLL组成的,它最基本的三大组成模块Kernel、GDI和User 都是DLL,它所有的库模块也都设计成DLL。凡是以.DLL、.DRV、.FON、.SYS和许多以.EXE为扩展名的系统文件都是DLL,要是打开Windows"System目录,就可以看到许多的DLL模块。尽管DLL在Ring3优先级下运行,仍是实现硬件接口的简便途径。DLL可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式,减少了编程设计上的不便;同时,一个DLL在内存中只有一个实例,使之能高效经济地使用内存;DLL实现的代码封装性,使得程序简洁明晰;此外还有一个最大的特点,即DLL的编制与具体的编程语言及编译器无关,只要遵守DLL的开发规范和编程策略,并安排正确的调用接口,不管用何种编程语言编制的DLL都具有通用性。例如在BC31中编制的DLL程序,可用于BC、VC、VB、Delphi等多种语言环境中。笔者在BC31环境下编译了Windows下直接内存访问和端口I/O两个DLL,用在多个自制系统的应用软件中,运行良好。

二、DLL的建立和调用 

关于DLL的建立,有如下几个方面的要素是不可缺少和必须掌握的: 
就象C程序中的WinMain( )一样,Windows每次加载DLL时都要执行LibMain( )函数,主要用来进行一些初始化工作。通常的形式是: 
wHeapSize,LPSTR lpszCmdLine) 
if(wHeapSize!=0) //使局部堆、数据段可移动 
/*此处可进行一些用户必要的初始化工作*/ 

Windows从内存中卸载DLL时,调用相应的出口函数WEP( ),主要做一些清理工作,如释放占用的内存资源;丢弃某些字串、位图等资源;关闭打开的文件等等。

自定义的输出函数 

输出函数的引出方法 
EXPORTS WEP @1 residentname //residentname可提高DLL效率和处理速度 
PortOut @3 //通常对所有输出函数附加系列号 
以上两种方法任选其中的一种即可,不可重复。后面的两个实例分别使用了上述两种不同的引出方式,请留意。

2.DLL的调用 
当前工作盘。 
Windows系统目录,即System子目录;调用GetSystemDiretory( )函数可获得这个目录的路径名。 
网络中映象的目录列表中的全部目录。

  DLL模块中输出函数的调用方法: 
在应用程序模块定义文件中,用IMPORTS语句列出所要调用DLL的函数名。如: 
MEMORYDLL.MemoryWrite 
先用LoadLibrary加载DLL,再用GetProcAddress函数检取其输出函数的地址,获得其指针来调用。如: 
FARPROC lpFunc; 

if(hLibrary>31) //加载成功 
lpFunc=GetProcAddress(hLibrary,"PortIn"); //检取PortIn函数地址 
PortValue=(*lpFunc)(port); //读port端口的值 

三、DLL应用实例源程序 
//.DEF文件 
DESCRIPTION ''DLL FOR MEMORY_READ_WRITE '' 
CODE PRELOAD MOVEABLE DISCARDABLE 
HEAPSIZE 1024 //DLL无自己的堆栈,故没有STACKSIZE语句 
ReadMemory @2 

  //.CPP文件 

  int FAR PASCAL LibMain(HINSTANCE hInstance,WORD wDataSeg,WORD 

UnlockData(0); 
}

  int FAR PASCAL MemoryRead(unsigned int DosSeg,unsigned int DosOffset) 
WORD wDataSelector,wSelector; 
char value; 
wSelector=AllocSelector(wDataSelector); //分配选择器 
SetSelectorBase(wSelector,(((DWORD)DosSeg)

责编:罗莉

发表评论(共0条评论)
请自觉遵守互联网相关政策法规,评论内容只代表网友观点,发表审核后显示!

国家电网校园招聘考试直播课程通关班

  • 讲师:刘萍萍 / 谢楠
  • 课时:160h
  • 价格 4580

特色双名师解密新课程高频考点,送国家电网教材讲义,助力一次通关

配套通关班送国网在线题库一套

课程专业名称
讲师
课时
查看课程

国家电网招聘考试录播视频课程

  • 讲师:崔莹莹 / 刘萍萍
  • 课时:180h
  • 价格 3580

特色解密新课程高频考点,免费学习,助力一次通关

配套全套国网视频课程免费学习

课程专业名称
讲师
课时
查看课程
在线题库
面授课程更多>>
图书商城更多>>
在线报名
  • 报考专业:
    *(必填)
  • 姓名:
    *(必填)
  • 手机号码:
    *(必填)
返回顶部