句柄、路径、dll

上传人:自*** 文档编号:79028594 上传时间:2019-02-16 格式:DOCX 页数:11 大小:61.72KB
返回 下载 相关 举报
句柄、路径、dll_第1页
第1页 / 共11页
句柄、路径、dll_第2页
第2页 / 共11页
句柄、路径、dll_第3页
第3页 / 共11页
句柄、路径、dll_第4页
第4页 / 共11页
句柄、路径、dll_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《句柄、路径、dll》由会员分享,可在线阅读,更多相关《句柄、路径、dll(11页珍藏版)》请在金锄头文库上搜索。

1、句柄的概念:所谓句柄实际上是一个数据,是一个Long (整长型)的数据。 句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。 从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄

2、,以引用相应的对象。 如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢? 为了解决这个问题,Windows操作系统为各应用程

3、序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。 句柄地址(稳定)记载着对象在内存中的地址对象在内存中的地址(不稳定)实际对象 本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应

4、用程序,然后通过句柄来进行操作。 但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。API(Application Programming Interface,应用程序编程接口)HWND:全称是 Handle of Window,是一个窗体的句柄,基于THandle。HDC :Handle to a device context (DC). 即指向一个设备上下文DLL:Dyn

5、amic-Link Libraries(动态链接库)exceptionkspnn.例外,除外;反对,批评;法律异议,反对ExtractFileDir 获取文件路径getcurrentdir:获取当前路径Delphi GetModuleFileName函数的用法(可以获取项目的路径,桌面的路径,我的文档的路径)2011-04-13 09:00:50|分类:Delphi|字号订阅function GetModuleFileName(Module: HMODULE; Buffer: PChar; BufLen: Integer): Integer;Module模块的句柄模块,其文件名是必需的。Buf

6、fer是一个缓冲区,它接收文件的名称。BufLen是在缓冲区的字节数。GetModuleFileName返回写入缓冲区的字节数。警告:GetModuleFileName并不总是成功的。在应用程序调用方式,在/ proc文件系统的存在,以及其他因素的不同,有些时候可能会返回GetModuleFileName一个不完全合格的名称,或在某些情况下,没有在所有的文件名。请务必在使用前要检查这个返回值函数的结果。当前项目的路径 function GetCurrPath(IsAutoGetDll: boolean = true): string; 当前项目的全部的路径(包括exe) function Ge

7、tCurrDllpath: string; 获取桌面 function GetDeskeptPath: string; 获取我的文档 function GetMyDoumentpath: string;- 过程名: GetCurrPath 作者: 张志峰 日期: 2010.11.23 参数: 无 返回值: String 说明: 获取当前项目的路径-function GetCurrPath(IsAutoGetDll: boolean = true): string;var ModName: array0.MAX_PATH of Char;begin if ModuleIsLib and IsAu

8、toGetDll then begin GetModuleFileName(HInstance, ModName, SizeOf(ModName); / 取得当前项目的路径 Result := ExtractFilePath(ModName); end else Result := ExtractFilePath(ParamStr(0);end;- 过程名: GetCurrDllpath 作者: 张志峰 日期: 2010.11.23 参数: 无 返回值: String 说明: 获取当前项目的路径包括exe-function GetCurrDllpath: string;var p: pchar

9、;begin getmem(p, 255); try getmodulefilename(hinstance, p, 255); result := trim(strpas(p); finally freemem(p, 255); end;end;function GetShellFolders(strDir: string): string;const regPath = SoftwareMicrosoftWindowsCurrentVersionExplorerShell Folders;var Reg: TRegistry; strFolders: string;begin Reg :=

10、 TRegistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if Reg.OpenKey(regPath, false) then begin strFolders := Reg.ReadString(strDir); end; finally Reg.Free; end; result := strFolders;end;获取桌面function GetDeskeptPath: string;begin Result := GetShellFolders(Desktop); /是取得桌面文件夹的路径end;获取我的文档function G

11、etMyDoumentpath: string;begin Result := GetShellFolders(Personal); /我的文档end;Delphi中DLL的创建和使用 1.DLL简介; 2.调用DLL; 3.创建DLL; 4.两个技巧; 5.初始化; 6.例外处理。 1、DLL简介 DLL是Dynamic-Link Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图、图标等)。可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用程序或者其他DLL调用。DLL为应用程序间的资源共享提供了方便,同时也是多语言混合编程的重要手段。

12、由此可见学习使用DLL是Windows程序员必须掌握的一项重要技术。 2、如何调用DLL 在Delphi中有两种方法调用DLL中的函数和过程,即外部声明或者动态加载。 外部声明 在Delphi中外部声明是访问外部例程最容易和最常用的方式,有两种声明方式:通过名字、通过索引号。举例如下:在MYDLL.DLL中有两个函数和一个过程,则其外部声明可以写成: function test1:integer;external mydll; /直接通过名称调用test1(注意名称大小写敏感)。 function test11:integer;external mydll name test1; /通过名称调

13、用test1,在程序中使用新名称(原名称仍然大小写敏感)。 procedure test2;external mydll index 1; /通过索引号调用TEST2。程序中可以用与DLL中不一样的名称. 使用外部声明的缺点是程序启动时如果找不到mydll.dll将无法运行,即使没有调用其中的模块。 动态加载的方法可以避免这种情况。 动态加载 通过调用Windows API中的相关函数,将DLL调入内存并获得指向函数或过程的指针,执行完模块后释放内存。除了节约内存外,这种方法的一个很大的优点是能处理找不到dll或者在装入过程中出错的情况。这样即使某个dll有问题,应用程序的其他部分仍然能够正常运行。动态加载的例子如下: var hDll:THandle; Test1:function:integer; begin hDll:=LoadLibrary(mydll.dll); if hDll32 then exit;/如果Dll无法加载则跳出

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号