- 浏览: 1779865 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (641)
- vb2005xu自己动手系列 (174)
- vb2005xu开发文章转摘 (47)
- vb2005xu发发牢骚 (99)
- vb2005xu新技术灌水 (12)
- vb2005xu网络资源集锦 (21)
- vb2005xu软件学习 (60)
- 英语学习 (3)
- JavaScript 学习 (54)
- JAVA OOP 巩固 之 CustomDatabase 的开发 (5)
- 2013年9月之前所在公司 记事 (7)
- FleaPHP/QEEPHP 资料 (87)
- JAVA MAIL 学习篇 (4)
- Python turbogears (5)
- Rails 个人开发四部曲 (3)
- 名人传 (8)
- iwp framework (5)
- 高考零分作文 (5)
- startos (8)
- lua (0)
- 职场 (1)
最新评论
-
hellotieye:
自己 评论 自己 挺嗨呀
Mysql sql查询时 if 的用法 -
igevin:
转载请标明出处,转自Gevin的博客http://blog.i ...
RESTful API 编写指南 -
Theobob:
...
实现简单的ACL -
vb2005xu:
比如 对于 curl 调用就不再需要 加各种if 判断了,
$ ...
搞一个简单的数据打印工具AsDebug の Laravel -
vb2005xu:
http://geekplux.com/wiki/
YII2 模块内自定义错误页
本文转摘自http://linxh.bokee.com/2946294.html 作者: linxh
摘 要: 本文介绍了DLL技术在Windows编程中的基本运用方法及应用,给出了直接内存
访问及端口I/O的两个实用DLL的全部源代码。
关键词: DLL Windows编程 内存访问 I/O
一 、引 言
由于Windows为微机提供了前所未有的标准用户界面、图形处理能力和简单灵便的操作,绝大多数程序编制人员都已转向或正在转向Windows编程。在许多用户设计的实际应用系统的编程任务中,常常要实现软件对硬件资源和内存资源的访问,例如端口I/O、DMA、中断、直接内存访问等等 。若是编制DOS程序,这是轻而易举的事情,但要是编制Windows程序,尤其是WindowsNT环境下的程序,就会显得较困难。
因为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的建立及调用方法在许多资料上有详细的介绍,为了节省篇幅,在这里仅作一些
主要的概括。
1.DLL的建立
关于DLL的建立,有如下几个方面的要素是不可缺少和必须掌握的:
?. 入口函数LibMain( )
就象C程序中的WinMain( )一样,Windows每次加载DLL时都要执行LibMain( )函数,主要用来进行一些初始化工作。通常的形式是:
int FAR PASCAL LibMain(HINSTANCE hInstance,WORD wDataSeg,WORD
wHeapSize,LPSTR lpszCmdLine)
{
if(wHeapSize!=0) //使局部堆、数据段可移动
UnlockData(0); //解锁数据段
/*此处可进行一些用户必要的初始化工作*/
return 1; //初始化成功
}
?出口函数WEP( )
Windows从内存中卸载DLL时,调用相应的出口函数WEP( ),主要做一些清理工作,如释放占用的内存资源;丢弃某些字串、位图等资源;关闭打开的文件等等。
?自定义的输出函数
为了让位于不同内存段的应用程序进行远程调用,自定义的输出函数必须定义为远程函数(使用FAR关键字),以防使用近程指针而得到意外的结果;同时,加上PASCAL关键字可加快程序的运行速度,使代码简单高效,提高程序的运行速度。
?输出函数的引出方法
? 在DLL的模块定义文件中(.DEF)由EXPORTS语句对输出函数逐一列出。例如:
EXPORTS WEP @1 residentname //residentname可提高DLL效率和处理速度
PortIn @2
PortOut @3 //通常对所有输出函数附加系列号
? 在每个输出函数定义的说明中使用_export关键字来对其引出。
以上两种方法任选其中的一种即可,不可重复。后面的两个实例分别使用了上述两种不同的引出方式,请留意。
2.DLL的调用
加载DLL时,Windows寻找相应DLL的次序如下:
?.当前工作盘。
?Windows目录;GetWindowsDirectory( )函数可提供该目录的路径名。
?Windows系统目录,即System子目录;调用GetSystemDiretory( )函数可获得这个目录的路径名。
?DOS的PATH命令中罗列的所有目录。
?网络中映象的目录列表中的全部目录。
DLL模块中输出函数的调用方法:
不论使用何种语言对编译好的DLL进行调用时,基本上都有两种调用方式,即静态调用方式和动态调用方式。静态调用方式由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码(如还有其它程序使用该DLL,则Windows对DLL的应用记录减1,直到所有相关程序都结束对该DLL的使用时才释放它),简单实用,但不够灵活,只能满足一般要求。动态调用方式是由编程者用API函数加载和卸载DLL来达到调用DLL的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。具体来说,可用如下的方法调用:
?.在应用程序模块定义文件中,用IMPORTS语句列出所要调用DLL的函数名。如:
IMPORTS MEMORYDLL.MemoryRead
MEMORYDLL.MemoryWrite
?让应用程序运行时与DLL模块动态链接
先用LoadLibrary加载DLL,再用GetProcAddress函数检取其输出函数的地址,获得其指针来调用。如:
HANDLE hLibrary;
FARPROC lpFunc;
int PortValue;
M
hLibrary=LoadLibrary("PORTDLL.DLL"); //加载DLL
if(hLibrary>31) //加载成功
{
lpFunc=GetProcAddress(hLibrary,"PortIn"); //检取PortIn函数地址
if(lpFunc!=(FARPROC)NULL) //检取成功则调用
PortValue=(*lpFunc)(port); //读port端口的值
FreeLibrary(hLibrary); //释放占用的内存
}
M
三、DLL应用实例源程序
1.直接内存访问的DLL源代码
//.DEF文件
LIBRARY MEMORYDLL
DESCRIPTION 'DLL FOR MEMORY_READ_WRITE '
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE SINGLE
HEAPSIZE 1024 //DLL无自己的堆栈,故没有STACKSIZE语句
EXPORTS WEP @1 residentname
ReadMemory @2
WriteMemory @3
//.CPP文件
#include <windows.h>
int FAR PASCAL LibMain(HINSTANCE hInstance,WORD wDataSeg,WORD
wHeapSize,LPSTR lpszCmdLine)
{
if(wHeapSize!=0)
UnlockData(0);
return 1;
}
int FAR PASCAL MemoryRead(unsigned int DosSeg,unsigned int DosOffset)
{
WORD wDataSelector,wSelector;
char far *pData;
char value;
wDataSelector=HIWORD((DWORD)(WORD FAR *)&wDataSelector);
wSelector=AllocSelector(wDataSelector); //分配选择器
SetSelectorLimit(wSelector,0x2000); //置存取界限
SetSelectorBase(wSelector,(((DWORD)DosSeg)<<4)+(DWORD)DosOffset); //置基地址
pData=(char far *)((DWORD)wSelector<<16);
value=*pData;
FreeSelector(wSelector); //释放选择器
return (value);
}
void FAR PASCAL MemoryWrite(unsigned int DosSeg,unsigned int DosOffset,char Data)
{
WORD wDataSelector,wSelector;
char far *pData;
wDataSelector=HIWORD((DWORD)(WORD FAR *)&wDataSelector);
wSelector=AllocSelector(wDataSelector);
SetSelectorLimit(wSelector,0x2000);
SetSelectorBase(wSelector,(((DWORD)DosSeg)<<4)+(DWORD)DosOffset);
pData=(char far *)((DWORD)wSelector<<16);
*pData=Data;
FreeSelector(wSelector);
}
int FAR PASCAL WEP(int nParam)
{
return 1;
}
2.端口读写I/O的DLL源代码
//.DEF文件
LIBRARY PORTDLL
DESCRIPTION 'DLL FOR PORT_IN_OUT '
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE SINGLE
HEAPSIZE 1024
//.CPP文件
#include <windows.h>
#include <dos.h>
int FAR PASCAL LibMain(HINSTANCE hInstance,WORD wDataSeg,WORD
wHeapSize,LPSTR lpszCmdLine)
{
if(wHeapSize!=0)
UnlockData(0);
return 1;
}
int FAR PASCAL _export PortOut(int port,unsigned 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文件各自组成一个.PRJ文件,并进行编译链接成.EXE或.DLL文件就可以在应用程序中对其进行调用。
四、结 束 语
在上面,我们利用DLL技术方便地实现了Windows环境下对内存的直接访问和端口I/O的访问,仿效这两个例子,还可以编制出更多的适合自己应用系统所需的DLL,如用于数据采集卡的端口操作及扩展内存区访问、视频区缓冲区及BIOS数据区操作等许多实际应用的编程任务中。必要时只需直接更新DLL,而用不着对应用程序本身作任何改动就可以对应用程序的功能和用户接口作较大的改善,实现版本升级。因此,掌握好DLL技术对Windows程序开发者很有裨益。
发表评论
-
RESTful API 编写指南
2016-06-14 11:12 5182基于一些不错的RESTful ... -
谈冷热数据
2015-07-20 11:13 6156http://jishu.zol.com.cn/11379. ... -
贺岁文:部门正副经理之争
2015-01-29 11:57 1181http://blog.csdn.net/shenyisyn ... -
只能通过chrome网上应用商店安装该程序”的解决方法
2014-10-09 13:09 6148自 Chrome 21.x 开始默认只允许从 Chrome ... -
nginx同一iP多域名配置方法
2014-06-03 13:48 2692nginx绑定多个域名可又把多个域名规则写一个配置文件里,也 ... -
风车网陈晓峰回忆录:我的两个月倒闭史
2014-05-27 16:09 1341http://tech2ipo.com/54719 ... -
Debugging and Profiling PHP with Xdebug
2014-04-15 12:10 1739http://www.sitepoint.com/debug ... -
XHProf 中文文档
2014-04-15 11:26 1460XHProf文件(草稿) 翻译:徐 ... -
让普通用户登录phpmyadmin不显示information_schema
2014-02-13 16:54 1914http://www.cnblogs.com/faily20 ... -
apache2.2+svn1.6+TortoiseSVN在windows环境搭建
2013-12-21 21:58 4467今天空闲时间对SVN服务器端和客户端环境做了搭建,并且成功了 ... -
MiniCMS - 吐槽
2013-10-22 10:58 1448看到的深有感触, ... -
MySQL 数据库通过日志恢复
2013-08-14 17:09 1091http://blog.csdn.net/hanxin198 ... -
使用文件函数操作Memcache
2013-08-12 18:21 1525写道 最近一周,SAE又悄悄的上线了一个新功能.那就是开始 ... -
转 总结过去10年
2013-08-10 11:17 1122下面的好文 担心原作者删帖 转到此处吧 http:/ ... -
SAET SQL_CALC_FOUND_ROWS 问题
2013-07-20 14:22 2308上午遇到 应用数据查不到的问题,但是 数据库中明明 ... -
问一下使用struts的同学们,你们这些年,是怎么过来的?
2013-07-20 12:04 1371by 空虚浪子心 http://www.inbreak.ne ... -
杂谈产品灰度上线的研发模式
2013-05-13 13:45 1762写道 传统的产品研发 ... -
正则表达式口诀
2013-04-12 14:38 1467写道 来源:蓝血正则 ... -
Emacs 快速指南
2013-04-09 17:51 2328您正在阅读 Emacs 快速指南(Emacs tutorial ... -
推荐几个技术博客,持续更新中...
2013-03-18 10:07 3308推荐几个技术博客,我整理了一下googlereader的订 ...
相关推荐
压缩包中的"Windows下DLL编程技术及应用.htm"可能是详细的教程或示例代码,涵盖了创建和使用DLL的步骤,以及如何在DLL中实现DMA和I/O端口操作的实例。而"www.pudn.com.txt"可能是一个链接或版权信息,与教程内容有关...
《Windows下DLL编程技术及应用》 DLL(Dynamic Link Library)是Windows操作系统中的一种共享库机制,它允许多个程序共享同一段代码和数据,从而节省内存资源并促进代码复用。DLL文件通常包含函数和数据,可供其他...
在Windows操作系统中,DLL...总之,掌握Windows下的DLL编程技术,特别是使用MFC,对于开发高效且可维护的Windows应用程序至关重要。了解如何创建、调用和管理DLL,以及处理与MFC的集成,是提升软件开发技能的重要部分。
### MFC 下 DLL 编程详解 #### 一、引言 动态链接库(Dynamic Link Library,简称 DLL)是微软为 Windows 和 OS/2 操作系统设计的一种供应用程序在运行时调用的共享函数库。DLL 作为一种重要的共享组件,在 Windows...
DLL注入是系统级编程技术的一种,常用于调试、性能监控、安全检测等场景。本篇文章将深入探讨“Windows下DLL动态库注入和拦截”这一主题。 首先,我们要理解DLL注入的基本概念。DLL注入是指一个进程将自己的DLL加载...
总结,"Windows应用高级编程"包括了对Windows API的深入理解和应用,消息机制的掌握,多线程编程,网络通信,DLL使用,服务编程,调试技巧以及性能优化等多个领域。每个知识点都要求开发者具备扎实的理论基础和实践...
【Windows编程技术active】 在Windows编程领域,DLL(动态链接库)是一种常见的代码复用机制,它允许多个程序共享同一段代码,以...理解并掌握ActiveX编程技术,对于深入理解和开发Windows应用程序具有重要的意义。
本文将详细介绍如何利用Microsoft Foundation Classes (MFC) 进行DLL编程。 #### 二、DLL与静态库的对比 - **静态库(Library)**:在编译阶段,库函数会被嵌入到最终生成的可执行文件中。这种方式会导致程序体积...
综上所述,动态库DLL编程涉及到项目创建、函数导出、函数调用、版本控制、线程安全等多个方面,理解并熟练掌握这些知识点对于开发高效且可复用的Windows应用程序至关重要。通过学习提供的"动态链接库DLL编程篇...
这份资料集将通过实例和实践来详细讲解这些概念和技术,帮助你提升在VC++环境下进行DLL编程的能力。20090613dll这个文件名可能表示这是一个2009年6月13日发布的关于DLL编程的资料集合,里面可能包含了当时的最佳实践...
在软件开发领域,DLL(动态链接库)是一种重要的编程技术,尤其在Windows操作系统中,它允许程序员将可重用代码模块化,从而提高开发效率,减少内存占用,并方便地实现代码的更新与维护。本文将详细介绍基于Visual ...
MFC下DLL编程是一种非常有用的技术,可以提高应用程序的性能和可维护性。但是,需要小心地使用DLL,避免出现问题。 在MFC下DLL编程中,需要遵守一定的规则和惯例,例如,使用统一的命名规范,使用明确的函数名和...
DLL编程是开发者掌握Windows应用程序开发的关键技能之一,因为它能够实现代码共享,减少内存占用,提高系统性能。本资料集合了关于DLL编程的经典书籍内容,将帮助读者深入理解DLL的工作原理以及如何有效地进行DLL...
总之,“dll编程深入浅出(含源代码)”涵盖了DLL的基础知识、核心技术以及高级应用,适合有一定Windows编程基础的学习者进一步提升。通过学习和实践,你将能够熟练地编写和使用DLL,提升你的Windows程序设计能力。
DLL编程是Windows操作系统中一种重要的程序设计技术,它允许多个应用程序共享同一段代码和数据,从而节省内存资源和提高效率。DLL(Dynamic Link Library)文件是包含可执行代码和数据的库,它们作为服务器端存在,...
**DLL(动态链接库)编程在Windows环境下是开发者经常需要用到的技术。DLL文件是包含可由多个程序同时使用的代码和数据的库。在这个“VCDLL.rar”压缩包中,我们找到了一个VC++(Visual C++)创建DLL项目的实例,这...
DLL 编写教程 Windows 中 DLL 的编写入门手册 本资源为 Windows 中 DLL 的编写入门手册,详细讲述了...DLL 广泛应用于各种软件系统中,具有节省内存、不需编译的软件系统升级、DLL 库可以供多种编程语言使用等优点。
根据提供的文件内容,以下为Windows C语言网络编程技术与方法的知识点总结: 1. 网络编程概述:网络编程是针对网络应用的一种编程技术,它利用网络协议实现不同主机间进程的通信。在Windows环境下,C语言网络编程...
在Windows编程中,DLL(动态链接库)注入和卸载是一种常见的技术,常用于系统调试、性能监控或恶意软件操作。Qt是一个跨平台的应用程序开发框架,它也提供了与Windows API交互的能力,使得我们能够在Qt应用程序中...
总之,DLL编程是一种在Delphi及其他开发环境中广泛应用的技术,它使得代码可以模块化,提高开发效率,减少资源占用,并支持程序的功能扩展和升级。开发者在使用DLL时,需要考虑到其依赖性、兼容性以及安全性等问题,...