热区技术中的动态链接库应用.docx
《热区技术中的动态链接库应用.docx》由会员分享,可在线阅读,更多相关《热区技术中的动态链接库应用.docx(6页珍藏版)》请在冰豆网上搜索。
![热区技术中的动态链接库应用.docx](https://file1.bdocx.com/fileroot1/2023-1/26/106cb591-af8b-4a31-a862-8af640326f39/106cb591-af8b-4a31-a862-8af640326f391.gif)
热区技术中的动态链接库应用
热区技术中的动态链接库应用
摘要:
动态链接库,简称DLL,英文全称“DynamicLinkLibrary”。
动态链接是相对于静态链接而言的。
动态连接库是一个可以同时被多个程序使用的代码和数据的库,也可以理解为是一个可以被其它应用程序共享的程序模块。
分析了热区技术中的动态链接库的应用。
关键词:
热区;动态连接库;隐式调用;显示调用;DLL
0引言
随着计算机的快速发展,计算机的应用日益广泛,计算机软件的开发越来越重要,各种应用软件越来越多。
在Windows平台下同时打开多个可视化程序会导致Windows桌面的复杂化。
为了简化屏幕,在一些应用软件中,都具有热区的功能。
例如我们比较熟悉的QQ,当把QQ拖到屏幕的某一区域时,QQ自动隐藏;当把鼠标移回到某一区域时QQ可以自动弹出。
一般我们把这种可以自动隐藏和弹出程序的区域称为热区。
动态连接库是一个极其重要的技术,它可以使开发人员通过编写动态链接库,方便灵活地实现大型程序的开发。
本文介绍了在C+{++}Builder6.0平台下实现热区的过程中,通过编写动态链接库的方法,介绍了动态连接库的应用。
1动态链接库
动态链接是与静态连接相对的。
动态链接库(DLL)在物理上是一些独立的可执行代码的集合,同时也可以存放各种资源。
虽然动态链接库中存放可执行代码,但本身是不能运行的,只有被其它应用程序在运行时加载后,装入到应用程序占用内存的代码段,由应用程序调用动态链接库的代码,如图1所示。
一般来说,DLL是一种磁盘文件,以.DLL、.DRV、.FON、.SYS和许多以.EXE为扩展名的
系统文件都可以是DLL。
如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。
DLL模块中包含各种导出函数,用于向外界提供服务。
DLL可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式。
一个DLL在内存中只有一个实例;DLL实现了代码封装性。
DLL的编制与具体的编程语言及编译器无关。
在Windows操作系统中,DLL对于程序执行是非常的重要。
DLL不是一个可运行的程序,只能编译,生成DLL系统文件,然后加载到应用程序中。
当删除程序的时候,没有用的DLL文件也应该删除,不然随着安装程序的越来越多,DLL文件也会越来越多,久而久之就会造成系统的负担。
动态链接库代码在运行时间加载的特性很重要。
一个大型程序如果不使用动态链接库,那么当这个程序的某一个功能需要升级或改进,必须写一些源代码,然后将整个程序编译,连接形成一个新的可执行文件,最终给客户重新安装使用。
这个过程需要花费很长时间,哪怕只是给这个大型程序多写一行代码。
可是,如果采用大量动态链接库构建整个应用程序,那么只需要改写需要升级的动态链接库的源代码,重新编译连接后,发送给客户,客户所做的仅仅是覆盖原来的动态链接库即可,不需要重新安装整个应用程序。
使用动态链接库构建整个应用程序是模块化设计程序的一个重要特点。
2动态链接库的使用方式
其它应用程序需要使用DLL时,需要调用DLL文件,有两种调用方式:
静态调用方式和动态调用方式。
2.1静态调用方式
也称为隐式调用方式。
需要应用程序运行前,将伴随DLL文件发布的lib文件添加到工程中,并且使用DLL的文件中include伴随DLL文件发布的h文件。
然后就可以像调用一般函数一样调用DLL的导出函数。
2.2动态调用方式
也称为显示调用方式。
指在应用程序中运用LoadLibrary函数,DLL文件能被显式地映射到进程的地址空间。
动态调用方式的优点是在客户程序使用动态链接库的时候不需要包括含有导出函数声明的头文件,也不需要导入动态链接库生成的类型库(一组LIB文件)。
动态链接库的创建很多开发工具有专门的向导(比如C+{++}Builder)。
这里需要主要的是在应用程序退出之前,应该用FreeLibrary释放动态连接库。
3热区动态链接库的建立和用法
在C+{++}builder6.0集成开发环境中,建立一个From1,设置为热区。
通过菜单File|New|Other打开一个NewItems对话框,选择New中的DLLWizard。
生成DLL的主单元文件。
将会看到有如下的代码:
#include
#include
#pragmahdrstop
#pragmaargsused
intWINAPIDllEntryPoint(HINSTANCEhinst,unsignedlongreason,void*lpReserved)
{
return1;
}
这里DllEntryPoint()是DLL的入口函数,它将在DLL加载和卸载时被调用,调用的具体情况取决于参数reason。
hinst是DLL自身的句柄。
lpReserved用来说明进一步的参数。
下面在DLL库中加入代码以实现热区的功能,加入代码如下:
#definemHookWM_USER+1000//自己定义的消息
HINSTANCEhInst=NULL;//DLL的句柄
HHOOKhHook=NULL;//Hook的句柄
extern"C"{
void_export_stdcallInstallHook();//鼠标钩子安装且提供为外部接口
void_export_stdcallUnInstallHook();//鼠标钩子解除且提供为外部接口
}
LRESULTCALLBACKMouseProc(intnCode,WPARAMwParam,LPARAMlParam)
//回调函数
//对鼠标的坐标进行判断并返回;
{
HWNDhWnd=FindWindow(NULL,"热区");
MOUSEHOOKSTRUCT*mhStruct=(MOUSEHOOKSTRUCT*)lParam;
PostMessage(hWnd,mHook,mhStruct->pt.x,mhStruct->pt.y);
returnCallNextHookEx(hHook,nCode,wParam,lParam);
}
//找到使用DLL的窗体函数,返回需要的参数。
void_stdcallInstallHook()
{
if(!
hHook){
hHook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,hInst,0);
}
void_stdcallUnInstallHook()
{
if(hHook)
UnhookWindowsHookEx(hHook);
}
intWINAPIDllEntryPoint(HINSTANCEhinst,unsignedlongreason,void*lpReserved)
{
hInst=hinst;//DLL自身的句柄
return1;
}
这样可以很容易的实现热区所需要的返回参数值。
还可以实现代码的封闭性。
特别是像一些语言类的软件,可以分别将各种语言独立写在DLL中。
以供独立使用。
在升级时,可以分别独立的对库升级。
编译生成动态链接库。
这样加载到应用程序后就可以实现想要的功能。
当入口点函数返回FALSE值时,如果使用的是加载时动态链接,则应用程序不启动。
如果使用的是运行时动态链接,则只有个别DLL不会加载。
在Form1头文件.h中做声明,声明为public。
声明如下:
void__fastcallWndProc(Messages:
:
TMessage&Message);
boolflag;
然后在From1的*.cpp文件中编写实现热区功能的函数,用隐式调用的方式进行处理。
#definemHookWM_USER+1000
extern"C"{
void_stdcallInstallHook();//外部DLL安装鼠标钩子函数
void_stdcallUnInstallHook();//外部DLL解除鼠标钩子函数
}
void__fastcallTForm1:
:
FormCreate(TObject*Sender)
{
flag=false;
Caption="热区";//设置windows名称
InstallHook();//安装鼠标钩子
}
void__fastcallTForm1:
:
FormClose(TObject*Sender,TCloseAction&Action)
{
UnInstallHook();//解除鼠标钩子
}
编写功能函数,确定热区的区域范围。
添加控件Label1用来显示鼠标屏幕坐标、Label2用来显示Form的最大坐标值。
void__fastcallTfrmMain:
:
WndProc(Messages:
:
TMessage&Message)
{
intx,y;
staticintxRange,yRange;
if(Message.Msg==mHook)
{
x=Message.WParam;//mhStruct->pt.x,
y=Message.LParam;//mhStruct->pt.y
if(flag&&(x>xRange||y>yRange||x Form1->Visible=false;
if(x>=Left&&x<=xRange&&y<=20)//设置热区,这里设置单位为20
Form1->Visible=true;
Label1->Caption=AnsiString(Message.WParam)+","+Message.LParam;//显示鼠标屏幕坐标
Label2->Caption=AnsiString(xRange)+","+AnsiString(yRange);//显示Form的最大坐标值
}
if(Message.Msg==WM_MOVE)
{
yRange=Top+Height;//得到Form的最大横坐标
xRange=Left+Width;//得到Form的最大纵坐标
if(Form1->Top<20)
{
Form1->Top=0;
flag=true;
}
if(Top>=20)
flag=false;
}
TForm:
:
WndProc(Message);
}
在C+{++}Builder6.0下编译运行通过,实现了热区的功能。
4动态链接库的优点
动态链接库有很多的优点,总结如下:
(1)代码的复用。
DLL代码可以供多个程序使用。
如某个设备的驱动程序可以通过DLL发布,需要使用该设备的应用程序都可以通过调用这个DLL实现,这就避免为一个功能重复开发多份代码。
(2)代码在应用程序间共享。
DLL的好处不仅在逻辑上的共享,还包括物理上的共享。
多个应用程序使用DLL时,不必DLL代码的拷贝,它们可以共享已载入物理内存的DLL代码段,这样可以节约每个应用程序所占的内存。
(3)代码按功能分离。
DLL能将应用程序代码中重要和独立的功能分离出来,以后程序这部分功能的修改、升级,只要替换该DLL文件。
同时程序的维护也方便了。
(4)动态库可被多种计算机语言调用,便于在各种环境下的系统集成。
5结束语
动态链接库实际上还有很多应用,如:
组件技术、Windows服务等等。
动态链接库可以实现代码和资源的共享,大大减少系统资源的占用,因此在当今的应用程序开发中起着非常重要的作用。
参考文献:
[1]CHARLIECALVERT.C+{++}Builder应用开发大全[M].北京:
清华大学出版社,1999.
[2]陈国钦,詹仁辉.多窗口的动态链接库设计[J].福建电脑,2008
(2).
[3]廖伟川.Windows动态链接库调试技术[J].科技广场,2008(8).
[4]熊志勇.利用Hook技术实现屏幕热区[J].电脑编程技巧与维护,2002(12).
[5]李艳,边宏强.BorlandC+{++}Builder的消息机制与应用[J].河北工业科技,2005(7).
[6]蒋金弟,朱永辉,毛培法.C+{++}Builder中如何拦截Windows消息[J].计算机与现代化,2001(3).