原创 编程常用文件常识

2008-9-20 20:09 4651 8 8 分类: 软件与OS

可执行文件
可执行文件 (executable file) 可移植可执行 (PE) 文件格式的文件,它可以加载到内存中,并由操作系统加载程序执行。它可以是 .exe 或 .dll 文件。COM、BAT也都是可执行文件! 如记事本程序 notepad.exe ,这类程序通常用来处理或者辅助处理其它文件。比如:myfile.txt双击打开由notepad.exe记事本程序来进行编辑。我们做一件事,可以把顺序以及具体做什么事写在mybat.bat文件中,那运行它就可以把要做的事件执行了。可以理解为:这类文件可以“单独运行”,或者理解为“有生命”的文件!如果把它用日常通俗的一点的例子来形容:衣服,鞋子等都是普通的文件,那人就是可执行文件! 人可以做衣服穿衣服,衣服却要依靠人来做。布也要由人一加工成衣服!
dll
DLL文件(Dynamic Linkable Library 即动态链接库文件),是一种可执行文件,它允许程序共享执行特殊任
务所必需的代码和其他资源比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序 EXE 文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的 EXE 程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。Windows 系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的 DLL 文件,并可对它们单独编译和测试。在运行时,只有当 EXE 程序确实要调用这些 DLL 模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了 EXE 文件的大小和对内存空间的需求,而且使这些 DLL 模块可以同时被多个应用程序使用。Windows 自己就将一些主要的系统功能以 DLL 模块的形式实现。一般来说,DLL 是一种磁盘文件,以.dll、.DRV、.FON、.SYS 和许多以 .EXE 为扩展名的系统文件都可以是 DLL。它由全局数据、服务函数和资源组成,在运行时被系统加载到调用进程的虚拟空间中,成为调用进程的一部分。如果与其它 DLL 之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL 模块中包含各种导出函数,用于向外界提供服务。DLL 可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式;一个 DLL 在内存中只有一个实例;DLL 实现了代码封装性;DLL 的编制与具体的编程语言及编译器无关。在 Win32 环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL 模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。Windows 在加载 DLL 模块时将进程函数调用与 DLL 文件的导出函数相匹配。Windows 操作系统对 DLL 的操作仅仅是把 DLL 映射到需要它的进程的虚拟地址空间里去。DLL 函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。调用方式:1、静态调用方式:由编译系统完成对 DLL 的加载和应用程序结束时 DLL 卸载的编码(如还有其它程序使用该 DLL,则 Windows 对 DLL 的应用记录减1,直到所有相关程序都结束对该 DLL 的使用时才释放它,简单实用,但不够灵活,只能满足一般要求。隐式的调用:需要把产生动态连接库时产生的 .LIB 文件加入到应用程序的工程中,想使用 DLL 中的函数时,只须说明一下。隐式调用不需要调用 LoadLibrary() 和 FreeLibrary()。程序员在建立一个 DLL 文件时,链接程序会自动生成一个与之对应的 LIB 导入文件。该文件包含了每一个 DLL 导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB 文件作为 DLL 的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与 LIB 文件中导出符号相匹配,这些符号或标识号进入到生成的 EXE 文件中。LIB 文件中也包含了对应的 DL L文件名(但不是完全的路径名),链接程序将其存储在 EXE 文件内部。当应用程序运行过程中需要加载 DLL 文件时,Windows 根据这些信息发现并加载 DLL,然后通过符号名或标识号实现对 DLL 函数的动态链接。所有被应用程序调用的 DLL 文件都会在应用程序 EXE 文件加载时被加载在到内存中。可执行程序链接到一个包含 DLL 输出函数信息的输入库文件(.LIB文件)。操作系统在加载使用可执行程序时加载 DLL。可执行程序直接通过函数名调用 DLL 的输出函数,调用方法和程序内部其 它的函数是一样的。2、动态调用方式:是由编程者用 API 函数加载和卸载 DLL 来达到调用 DLL 的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。显式的调用:是指在应用程序中用 LoadLibrary 或 MFC 提供的 AfxLoadLibrary 显式的将自己所做的动态连接库调进来,动态连接库的文件名即是上面两个函数的参数,再用 GetProcAddress() 获取想要引入的函数。自此,你就可以象使用如同本应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用 FreeLibrary 或 MFC 提供的 AfxFreeLibrary 释放动态连接库。直接调用 Win32 的 LoadLibary 函数,并指定 DLL 的路径作为参数。LoadLibary 返回 HINSTANCE 参数,应用程序在调用 GetProcAddress 函数时使用这一参数。GetProcAddress 函数将符号名或标识号转换为 DLL 内部的地址。程序员可以决定 DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个 DLL 文件。使用 DLL 的程序在使用之前必须加载(LoadLibrary)加载DLL从而得到一个DLL模块的句柄,然后调用 GetProcAddress 函数得到输出函数的指针,在退出之前必须卸载DLL(FreeLibrary)。正因为DLL 有占用内存小,好编辑等的特点有很多电脑病毒都是DLL格式文件。但不能单独运行。 动态链接库通常都不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。DLL代表[url src="http://baike.baidu.com/view/113948.htm"]OSI(Open System Interconnection)参考模型的第二层:[url src="http://baike.baidu.com/view/239592.htm"]数据链路层(Data Link Layer)。   该层是许多有线LAN和无线LAN技术主要起作用的地方。例如:以太网,令牌网,光纤分布式数据接口(FDDI)和802.11(无线以太网或Wi-Fi)这些有时被称为数据链路层技术。数据链路层在概念上常被划分为两个子层:逻辑链路控制(logical link control,LLC)和媒体访问控制(media access control,MAC).   数据链路层主要执行以下任务:   逻辑链路控制(LLC)。   媒体访问控制(MAX)。   数据成帧。   寻址。   差错检测和处理。   物理层标准。      详细请参见《TCP/IP指南(卷一)底层核心协议》第二部分第六章6.2小节。
exe
一定义1. EXE File 可执行程序 一种可在操作系统存储空间中浮动定位的可执行程序。MS-DOS和MS-WINDOWS下,此类文件扩展名为.exe 2.WINDOWS操作系统中的二进制可执行文件,可执行文件分两种一种是后辍名为.COM另一种就是.EXE 了.COM一般用于DOS,在WINDOWS系统中的执行文件一般都是.EXE文件在 MS-DOS 中,用以标识可执行文件的文件扩展名。用户在提示行中输入不带 .exe 扩展名的文件名后按 Enter 键就能运行可执行程序二 EXE文件结构 EXE 文件比较复杂,每个EXE文件都有一个文件头,结构如下:       EXE文件头信息        ―――――――――――――――――――     ├ 偏移量 ┤   意义       ┤      ├00h-01h ┤MZ'EXE文件标记    ┤      ├2h-03h ┤文件长度除512的余数  ┤      ├04h-05h ┤...............商   ┤      ├06h-07h ┤重定位项的个数     ┤      ├08h-09h ┤文件头除16的商    ┤      ├0ah-0bh ┤程序运行所需最小段数 ┤      ├0ch-0dh ┤..............大.... ┤      ├oeh-0fh ┤堆栈段的段值 (SS)  ┤      ├10h-11h ┤........sp      ┤      ├12h-13h ┤文件校验和      ┤      ├14h-15h ┤IP          ┤      ├16h-17h ┤CS          ┤      ├18h-19h ┤............      ┤      ├1ah-1bh ┤............      ┤      ├1ch   ┤............      ┤  ―――――――――――――――――――――――――.EXE文件包含一个文件头和一个可重定位程序映象。文件头包含MS-DOS用于加载程序的信息,例如程序的大小和寄存器的初始值。文件头还指向一个重定位表,该表包含指向程序映象中可重定位段地址的指针链表。文件头的形式与EXEHEADER结构对应: EXEHEADER STRUC exSignature dw 5A4Dh ;.EXE标志 exExraBytes dw ? ;最后(部分)页中的字节数 exPages dw ? ;文件中的全部和部分页数 exRelocItems dw ? ;重定位表中的指针数 exHeaderSize dw ? ;以字节为单位的文件头大小 exMinAlloc dw ? ;最小分配大小 exMaxAlloc dw ? ;最大分配大小 exInitSS dw ? ;初始SS值 exInitSP dw ? ;初始SP值 exChechSum dw ? ;补码校验值 exInitIP dw ? ;初始IP值 exInitCS dw ? ;初始CS值 exRelocTable dw ? ;重定位表的字节偏移量 exOverlay dw ? ;覆盖号 EXEHEADER ENDS程序映象,包含处理器代码和程序的初始数据,紧接在文件头之后。它的大小以字节为单位,等于.EXE文件的大小减去文件头的大小,也等于exHeaderSize的域的值乘以16。MS-DOS通过把该映象直接从文件拷贝到内存加载.EXE程序然后调整定位表中说明的可重定位段地址。 定位表是一个重定位指针数组,每个指向程序映象中的可重定位段地址。文件头中的exRelocItems域说明了数组中指针的个数,exRelocTable域说明了分配表的起始文件偏移量。每个重定位指针由两个16位值组成:偏移量和段值。 为加载.EXE程序,MS-DOS首先读文件头以确定.EXE标志并计算程序映象的大小。然后它试图申请内存。首先,它计算程序映象文件的大小加上PSP的大小再加上EXEHEADER结构中的exMinAlloc域说明的内存大小这三者之和,如果总和超过最大可用内存块的大小。则MS-DOS停止加载程序并返回一个出错值。否则面,它计算程序映象的大小加上PSP的大小再加上EXEHEADER结构中exMaxAlloc域说明的内存大小之和,如果第二个总和小于最大可用内存块的大小,则MS-DOS 分配计算得到的内存量。否则,它分配最大可用内存块。分配完内存后,MS-DOS确定段地址,也称为起始段地址,MS-DOS从此处加载程序映象。如果exMinAlloc域和exMaxAlloc域中的值都为零,则MS-DOS把映象尽可能地加载到内存最高端。否则,它把映象加载到紧挨着PSP域之上。接下来,MS-DOS读取重定位表中的项目调整所有由可重定位指针说明的段地址。对于重定位表中的每个指针,MS-DOS寻找程序映象中相应的可重定位段地址,并把起始段地址加到它之上。一旦调整完毕,段地址便指向了内存中被加载程序的代码和数据段。 MS-DOS在所分配内存的最低部分建造256字节的PSP,把AL和AH设置为加载 .COM程序时所设置的值。MS-DOS使用文件头中的值设置SP与SS,调整SS初始值,把起始地址加到它之上。MS-DOS还把ES和DS设置为PSP的段地址.最后,MS-DOS从程序文件头读取CS和IP的初始值,把起始段地址加到CS之 上,把控制转移到位于调整后地址处的程序。
COM组件
COM组件是以WIN32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行代码组成。COM组件是遵循COM规范编写的COM组件是一些小的二进制可执行文件COM组件可以给应用程序、操作系统以及其他组件提供服务自定义的COM组件可以在运行时刻同其他组件连接起来构成某个应用程序COM组件可以动态的插入或卸出应用COM组件必须是动态链接的COM组件必须隐藏(封装)其内部实现细节COM组件必须将其实现的语言隐藏COM组件必须以二进制的形式发布COM组件必须可以在不妨碍已有用户的情况下被升级COM组件可以透明的在网络上被重新分配位置COM组件按照一种标准的方式来宣布它们的存在
COM组件不是一种计算机语言COM组件不是DLL,只是利用DLL来给组件提供动态链接的能力COM组件不是一个API函数集。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /3 下一条