版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精通WindowsAPI(函数、接口、编程实例)上篇目录\h第1章idows应用序开发入门16\h1.1第一实例程序16\h1.1.1sart.exe16\h1.1.2indosAPI17\h1.1.3程入口函数17\h1.1.4stat.c代码分析17\h1.2编译码18\h1.2.1安装isualtudio18\h1.2.2安装MicrosoftPlatformSK19\h1.2.3集成MicrosoftPlatformS与isualC++速成版20\h1.2.4istaSDK与isualtudi0200821\h1.2.5isualtudio专业或团队系统版22\h1.2.6使图形化IE建立工程、进行编译22\h1.2.7解决方案”与“工程”23\h1.2.8使命令行工具编译23\h第2章idowsAI概要24\h2.1indos数据类型24\h2.1.1indos数据类型示例25\h2.1.2indos数据类型与标准C数据类型的关系28\h2.1.3indos数据类型与indowsAPI28\h2.1.4indos中的数据结构29\h2.2ndosAI的功能分类29\h2.2.1系基本服务29\h2.2.2系管理31\h2.2.3用界面31\h2.2.4图和多媒体34\h2.2.5网络34\h2.2.6系安全34\h2.2.7其功能35\h2.3ndosAI核心DLL35\h2.3.1Krn132.dll35\h2.3.2User32.dll36\h2.3.3Gdi32.dll36\h2.3.4标准函数36\h2.3.5其他ll36\h2.4nicode和多字节36\h2.4.1W本和A版本的PI38\h2.4.2nicode与ASGI的转换39\h2.5对ndow程序设计规范的建议39\h第3章开发工具配置与使用41\h3.1使用iualC/C++编译链接工具41\h3.1.1编器cl.exe41\h3.1.2资源编译器rc.exe46\h3.1.3链器link.exe47\h3.1.4其工具53\h3.1.5编链接工具依赖的环境变量54\h3.1.6示:使用/D选项进行条件编译57\h3.2使用PlatformSDK58\h3.2.1PlatformSD的目录结构与功能58\h3.2.2为译链接工具设置环境变量59\h3.2.3PlatformSD工具集61\h3.2.4ndowsistaSDK63\h3.3编Makefile63\h3.3.1使用nake.exe构建工程63\h3.3.2Makefile实例65\h3.3.3注释65\h3.3.4宏66\h3.3.5描块:目标、依赖项和命令68\h3.3.6akefile预处理69\h3.3.7在PlatformSD的基础上使用nmake70\h3.4使用nDbg调试72\h3.4.1安inDbg72\h3.4.2编可调试的程序73\h3.4.3nDbg命令74\h3.4.4调过程演示74\h3.5集成发环境isualtudio77\h3.5.1工类型选择与配置77\h3.5.2isualtudio快捷式79\h3.5.3生项目79\h3.5.4调试79\h3.5.5选与设置80\h3.6开发境配置总结81\h第4章文件系统82\h4.1概述82\h4.1.1文系统的基本概念82\h4.1.2文系统主要AI83\h4.2磁盘驱动器管理85\h4.2.1遍卷并获取属性85\h4.2.2操驱动器挂载点91\h4.2.3判光驱中是否有光盘96\h4.2.4获磁盘分区的总容量、空闲容量、簇、扇区信息98\h4.3文件目录管理101\h4.3.1删、复制、重命名、移动文件102\h4.3.2创、打开、读写文件,获取文件大小105\h4.3.3创目录1\h4.3.4获程序所在的目录、程序模块路径,获取和设置当前目录12\h4.3.5查文件、遍历指定目录下的文件和子目录15\h4.3.6递遍历目录树18\h4.3.7获、设置文件属性和时间120\h4.4内存射文件125\h4.4.1使MappingFile提高文件读写的效率125\h4.4.2通MappingFile在进程间传递和共享数据130\h4.4.3通文件句柄获得文件路径133\h4.5总结136\h第5章内存管理137\h5.1indos内存管理原理137\h5.1.1基概念137\h5.1.2分与分段内存管理、内存映射与地址转换138\h5.1.3进的内存空间140\h5.1.4虚内存布局、内存的分工、堆与栈142\h5.1.5内的保护属性和存取权限142\h5.1.6本章I列表142\h5.2堆管理144\h5.2.1获堆句柄、分配与再分配堆144\h5.2.2获堆中内存块的大小信息148\h5.2.3释内存、销毁堆149\h5.3全局(lobal)和局部(Local)内存管理151\h5.3.1Gobal函数151\h5.3.2Local函数152\h5.3.3使全局和局部函数分配和释放内存、改变内存块属性153\h5.4虚拟存管理154\h5.4.1虚地址空间与内存分页154\h5.4.2分和释放可读可写的虚拟内存页面154\h5.4.3修内存页面状态和保护属性、将页面锁定在物理内存中157\h5.4.4管其他进程的虚拟内存158\h5.5内存作与内存信息管理159\h5.5.1复充、移动、清零内存块、防止缓冲区溢出159\h5.5.2获当前系统内存使用情况161\h5.5.3判内存指针的可用性162\h5.6各种存分配方式的关系与比较163\h5.6.1标准内存管理函数与indows内存管理API的关系163\h5.6.2功性区别164\h5.6.3效的区别164\h第6章进程、线程和模块165\h6.1基本念165\h6.1.1应程序与进程165\h6.1.2控台应用程序与图形用户界面应用程序166\h6.1.3动链接库、模块166\h6.1.4线、纤程与作业167\h6.1.5权与优先级167\h6.2进程理167\h6.2.1创进程、获取进程相关信息、获取启动参数168\h6.2.2编控制台程序和图形用户界面应用程序173\h6.2.3获和设置环境变量173\h6.3线程纤程176\h6.3.1创线程、退出线程、获取线程信息177\h6.3.2挂、恢复、切换、终止线程179\h6.3.3创远程线程、将代码注入其他进程中执行182\h6.3.4创纤程、删除纤程、调度纤程185\h6.3.5纤与线程的互相转换186\h6.4进程态信息191\h6.4.1PSAPI与oolhelpPI191\h6.4.2遍系统中的进程193\h6.4.3列进程的模块、线程197\h6.4.4进的堆使用、内存占用、虚拟内存大小,页面错误情况199\h6.5动态接库200\h6.5.1加、释放DLL、通过句柄获取DLL相关信息201\h6.5.2编动态链接库、导出函数201\h6.5.3创动态链接库工程,配置DLL编译链接选项203\h6.5.4运时动态获取DLL导出函数地址并调用204\h6.5.5声导出函数、创建lib库,为其他模块提供导入表调用接口205\h6.5.6通构建导入表调用DLL导出函数206\h第7章线程同步207\h7.1基本理207\h7.1.1线同步的过程207\h7.1.2同对象208\h7.1.3等函数208\h7.2同步象示例209\h7.2.1使用事件对象(Event)209\h7.2.2使互斥对象(Mutex)214\h7.2.3使信号量控制访问共享数据的线程数量217\h7.2.4使可等待计时器(ier)221\h7.3等待程和线程的执行完成224\h第8章服务225\h8.1基本念225\h8.1.1服控制器(SCM)225\h8.1.2服程序226\h8.1.3服控制管理程序226\h8.1.4系服务管理工具226\h8.1.5服的属性226\h8.2编写务程序227\h8.2.1入函数227\h8.2.2服主函数227\h8.2.3控处理函数228\h8.3实现服务的控制和管理231\h8.3.1创、删除服务231\h8.3.2启、停止服务,向服务发送控制请求234\h8.3.3管服务状态、配置服务、服务的依赖关系237\h第9章图形用户界面244\h9.1字符面程序244\h9.1.1基概念244\h9.1.2控台读写246\h9.1.3控台字体、颜色等属性,操作屏幕缓存249\h9.1.4控台事件259\h9.2图形户界面:基本概念262\h9.2.1窗口262\h9.2.2窗类263\h9.2.3消和消息处理函数263\h9.2.4控件263\h9.2.5资源264\h9.2.6对框264\h9.3图形户界面:窗口264\h9.3.1注窗口类266\h9.3.2创窗口267\h9.3.3窗消息处理函数269\h9.3.4窗属性、位置和大小273\h9.3.5窗显示方式274\h9.3.6.线消息队列和消息循环274\h9.4图形户界面:控件275\h9.4.1reiew控件275\h9.4.2为reiew控件增加节点277\h9.4.3reiew右键菜单278\h9.4.4Listew控件280\h9.4.5为Listiew控件增加分栏282\h9.4.6为Listiew控件增加项283\h9.4.7文框控件284\h9.4.8为本框控件设置文字285\h9.5界面源286\h9.5.1资脚本(.rc)286\h9.5.2资源定义和头文件289\h9.5.3在序中使用资源289\h9.6菜单290\h9.6.1菜资源和菜单句柄290\h9.6.2动增加、删除、设置菜单及菜单项291\h9.6.3菜消息处理292\h9.7对话框292\h9.7.1创对话框292\h9.7.2对框消息处理函数293第1章indows应用程序开发入门如何开始Windows应用程序开发的学习呢?本书将从一个最简单的Windows应用程序入手讲解Windows应用程序设计中的基本概念编程工具的使用安装与使用方法通过本章的学习,读者将会对Windows应用序的设计有一个初步的、直观的认识。1.1第一个实例程序本节给出一个完整的实例程序并对该程序源代码进行分析通过本节的学习读者可以了解Windows应用序源代码的必要组成部分以及它们的组织结构。1.1.1 start.exestart.exe是本书的第一个实例,创建一个简单的消息对话框。实例1-1第一个Windows应用程序start.exe打开书配套光盘,在第一章实例代码目录中找到可执行文件start.exe,运行start.exe,会弹如图1-1所示的消息对话框。这就是一个最简单的Windows应用序实例运行的效果,实现代码如下:1.1.2 indowsAPI实例1-1中,程序最核心的功能实现使用了WindowsAPI的MessageBox函数。就像C言有一系列库函数一样任何一种程序开发平台都会提供众多的接口函数供开发人员使用。Windows应用程序的开发核心问题是如何使用WindowsSDK所提供的API。所谓API是“ApplicationProgramInterface”的简写,中文含义为“应用程序接口”它是一系列函数宏数据类型数据结构的集合运行于Windows系统的用程序可以使用这些操作系统提供接口来完成应用程序需要的功能。MessageBox函数是Windows众多API中的一个,其的功能是弹出一个话框。1.1.3 程序入口函数WinMain函数是程序入口点,相当于C语言的main函数,定义如下:WinMain函数有4个参数:hInstance、hPrevIntance、lCmLine、nCmdhOW。
第一个数是hInstance,数据类型是HINSTANCE,此参数表示应用程序本次运行实例的句柄。
第二个数是hPrevInstance,数据类型也是HINSTANCE,表示应用程序之前运行实例的句,但是在实际应用中,此参数始终为NULL。
第三个数lpCmdLine是运行时数。如在cmd命令行中运行start.exeCommandArguments”那么lpCmdLine就指向字符串“CommandArguments”作用与C言中main函数的参数作用类似。数据类型LPSTR是WindowsAPI中常用的字符串类型。
最后一参数是nCmdShow数据型是int示应用程序窗(如果有的显示状态。WinMain函数的返回类型是int型的。在实例1-1中,使用了如下语句来返回。1.1.4 start.c代码分析现在分析1.1.1小节给出的实例1-1程序的源代码start.c。在代码的最开始是源代码文件信息的注释。之后是预编译声明,在本实例中共有两条预编译声明。这一行代码指明了包括Windows.h。Wndows.h是Windows应用程序开发中常用的头文件在Windows应用程序开发中所使用的很多的数据类型结PI接口函数都在Windows.h或Windows.h所包含的他头文件中进行了声明比如实例1-1所使用的MessageBox函数。如果不声明包括Windows.h,那么译器将不能识别MessageBox。这行码指明将源文件编译生成目标文(.obj后将目标文件链接成可执行文件的过程中需要使用到User32.lib,因为User32.lib中包含了MessageBox的链接信息。如果在链接程序时,调用链接器的参数中指明了链接时需要使用到user32.lib,这—句程序代码可以省略(参见第3章。代码接下来是WinMain函数的定义。在WinMain函数中调了MessageBox函数。MessageBox函数的原型如下:第一参数hWnd消息框所属的窗口的句柄,可以设置为NULL。第二参数lpText是字符串,表示消息框所显示的消息。第三参数lpCaption是字符串,表示消息框的标题。第四参数uType是消息框的类型,在实例1-1中设置为“MB_OK”,意思是消息框包含一个“确定”按钮。在MessageBox函数调用之后,程序返回O,束WinMain函数,退出进程。1.2编译代码本书使用VisualStudio和PlatformSDK为程序编译和连接的工具各版本的VisualStudio括VisualStudi06.0VsualStudi02003VsualStudi0200VisualStdi02008都可以用于编译本书中的实例程序。过去已经发行了的所有Windows版本,每一个版本都有一个PlatformSDK。Windows系统为应用程序提供了很多的调用接口,如果要使用这些调用接口就需要用于PlatformSDKPlatfomSDK提供开发Windows应用程序所必须的头文件库文件等Windows应用程序的开发接口是C\C++语言形式。读者可以使用PlatformSDKforWindowsXPSP2、PlatformSDKforWindowsServer203PlatformSDKforindowsVisaaVisualC++2005ExpressEdtionVisualC++速成版)是VisualStudi0205的一个子版本。包括了编译和连接的全部工具VC\VC++8.0,对编译本书的示例程序已经足够使用。微软公司提供官方下载,下载地址为http://msdn2.mirosoft.cm/zh-cn/expres/default.aspx各个版本的PlatformSDK都也可以从微软公司网站上下载到。在本中,将综合使用VisualC++ExpressEdition2005、VisualC++ExpresEditon2008以及McrosoftPlatformSDKXPS2版本003SP1版本和Vista版。1.2.1 安装iualtudioVisualStudio包括速成版、专业版和团队系统版本(VisualStudioTeamSystem)。速成版是免费的版本专业版和团队系统版本是商业版但是速成版的功能与专版的功能并没有太大的区别。如果读者使用VisualC++速成版,需单独安装MicrosoftPlatformSDK,并将其与VisualStudio集成在起,才可以在本机进行Windows应用程序的开发。VisualC++速成版安装步骤如下。(1)从软公司的站点上下载中文版的Visual++速成,也可以从本书配套光盘中获得。运行vcsetup.exe。(2)单“下一步”按钮。在这步,读者需要选择需要安装的组件。推荐安装图形化的IDE,IDE将大方便代码的编辑、编译等工作。不安装图形化IDE,者也可以使用命令行工具来编译程序。(3)在安装的过程中,需要连接上Intrnet。安装程序将下载WindowsInstaller3.1、NETFramewok和VisualC++2005速成版行安装。安装成后,进行注册就可以使用了。在VisualStudio安装目录下的bin文件夹中,读者可以看到包括cl.exe、nmake.exe、link.exe、lib.exerc.exe等编译和链接工具。安装了VisualC++成版后仅仅可以进行标准C程序和C++程序的开发但是还不能调用WindowsAPI,无法成一个Windows应用程序所需的大部分功能,因为缺少PlatformSDK。1.2.2 安装MicosoftPlatformSDKSDK是SoftwareDevlopmentit的缩写即“软件开发工具包”MicrooftlatfrmSDK是进行Windows应用程序的开发包。每一个Windows行版本都会有对应的PlaformSDK。SDK中使用与这个版本相一致的头文件和库文件等每一个版本Windows中新增加的API数据结构中会在其中 体现。下面以PlatformSDKforinowsServer203R2为例明,其版本的安装法类似。如图1-2示。单击“Next”按钮,选择安装选项。在一般情况下,选择典型安装可以满足使用需要。这里需要进行一些设置,所以选择“Custom”,如图1-3所示。在出现如图1-4所示的安装选择时,选择“ConfigurationOptions”→“RegisterEnvironmentVariables”选项,并选择完全安装。如果不选择此项,VisualStudio工具将无法找到SDK。在安装完成后,可以从PlatformSDK安装目录中找到若干头文件和库文件,如Windows.h、Kme132.lib等文件,这些就是我们进行Windows应用程序开发所必不可少的支持。1.2.3 集成MicosoftPlatformSDK与sualC++速成版在安完成后,还需要对VisualC++速成版进行设置,使编译链接工具可以找到SDK。如果编译链接工具找不到SDK,那在源代码中的API调将会产生编译链接错误。在VisualC++速成版中进行如下操作。在菜单中选择“工具”→“选项”,出现“选项”对话框,如图1-5所示。1.设置IDE环境在“选项”对话框中选择“项目和解决方案”→“VC++目录”。在“显示以下内容的目录”中选择列表中选择“包含文件,单击下方的“新建”按钮选择PlatformSDK安装目录下的“Include”文夹。如:C:\ProgramFiles\MicrosoftPatformSDK\Include.在选列表中选择“库文件”单击下方的“新建”按钮目录下的“Lib”文件夹,如:C:\ProgramFiles\MicrosoftPatformSDKYLib.在选列表中选择“可执行”单击下方的“新建”按钮目录下的“Bin”文件夹,如:C:\ProgramFilesYMicrosofiPatformSDK\Bin。2.设置环境变量
选择PlatformDK安装选择PlatformDK安装如果安装PlatformSDK时没有选择安装“ConfigurationOptions”→“RegisterEnvironmentVariables或者选择了“Typical”安装模块那么还需要为系统添加环境变量。MSSdk变量:值为SDK安装目录。Mstools变量:值为SDK安装目录。INETSDK变量:值为SDK安装目录。Bkoffice变量:值为SDK安装目录。Basemake变量:值为%SSdk%\Iclude\BKOffice.Mak。INCLUDE变量:值为%MSSdk%\Include\。LIB变量:值为%MSSdk%\Lib\。并在Path变量前加上%SSdk%\Bin\;%MSSdk%\in\WinNT\。VisualStudio专业版不需要上述设置但是也可以使用这种方法来更新VisualStudio所使用的SDK的版本。1.2.4 istaSDK与isualtudi02008截止书编写时,WindowsVista版本的SDK已经发布,VisualStudio的最新版本也已经升级到了2008版VisulStdi02008也区分为速版专业版团队系统版等VistaSDK的安装、使用与方法与之前版本的SDK安和使用方法类似。VisualStudi02008的安装与使用方法也与ⅥsualStudi02005的安装使月j方法也区别不大,速成版的VisualStudio仍然可以免费使用。但是新版本的SDK和VisualStudio提供了更丰富的功能,使用也更便捷。建议有条件的读者使用新版本SDK和VisualStudio。1.2.5 isualtudio专业版或团队系统版如果读者有VisualStudio专业版或团队系统版,可直接进行安装,专业版已经内嵌了PlatformSDK。在安完成后,不需配置就可使用。1.2.6 使用图形化IDE建立工程、进行编译在完成安装和设置后,本小节将以VisualC++速成版为说明如何编译1.1.1节的程序。
打开VisualC++速成。
新建工程在菜单中选择“文件一新建工程”在新建工程对话框中的“VisualC++”类别下,选择“空项目”,如图1-6所示。
输入项目名称,完成项目的建立。
在“解决方案装源管理器”中,右键单击工程名称,选择“添加一新建项”,在“添加新项”对话框中,选择“代码”,键入文件名称“start”,文件后缀是“.c”或者是“.cpp”都可以,如图1-7所示。
将实例1-1代码复到start.c中。
如果不需要调试,在工具栏(位于菜单栏下)中将“Debug”改为“Release”。
在菜单中选择“生成一生成解决方案”(或使用快捷键,一般是F7。
如果编译没有报错则在程序目录下会有“Debug”或”“Release文件夹可执行文件位于此。运行可执行文件,得到实例1-1运行结果。1.2.7 “解决方案”与“工程”“解决案”是指若干工程的集合一般大型的应用程序都不是一个可执行文件构成的,可能包括一个exe文件若干个dll文件等个解决方案下可以有零个多个工程个工程可以生成一个可执行文件。可以解决方案添加或删除工程。1.2.8 使用命令行工具编译除了用图形化的IDE工具,还可以使用nmake工具对程序进行编译和链接。nmake是一个字符界面程序,通过Makefile配置。在使用nmake工具时需要使用VisualStudio的命令行。将实例1-1中的代存为start.c,然后将实例1-2的容存为文件makefile。实例1-2编译start.c的makefile本实是一个makefile文件以用于编译start.c译时需要使用到nmake工具,其代码如下所示:将makefile文件和start.c文件放在同一目录下在开始单“VisualStudioTools”目录下找到“VisualStudi02005\2008命令提示”(VisualStudi02005\2008CommandPrompt)并运行。切换到start.c和makefile两文件所在的目录,运行“nmake.exe”,输出如下:如果没有报告错误,将在目录下出现START_BIN”文件夹,star.exe位于此文件夹中。至此已经可以使用开发工具编译链接程序代码得到可执行程序本书第3章还会详细介绍编译链接工具的原理和使用方法。第2章indowsAPI概要本章要讲解Windows程序设计的一些基本概念包括在Windows应用程序设计中所使用到的一些特有的数据类型对Windows众多的API进行了分类介绍还初步介绍WindowsAPI与动态链接的原理,Windows应程序所使用的字符集等。2.1indows数据类型WindowsAPI使用了很多Windows自己定义的数据类型者可能较为熟悉C语言或C++语言的数据类型要熟练使用WindowsAPI必须要熟悉Windows数据类这些数据类型是Windows特有的。在SDK的相关头文件中有定义。在众的Windows数据类型中,最常用的有DWORD、HANDLELPTSTR、WORD、BYTE、CHAR等。在Windows统中,DWORD用于表无符号整型的数,意为doubleword,32位。在一般情况下BYTE是8位的,而WORD是16位,WORD是32位的。Windows系统的应用程序中还具有一个特有的数据类型-HANDLE常HANDLE型的变量用于唯一标识一个“对象,如窗口、控件、文件等,Windows平台中存在众多这样的对象,对象是程序操作的目。HANDLE也是一个32位的数据类型。2.1.1 indows数据类型示例实例2-1使用了几种基本的Windows数据类型演示Windows数据类型程序中的使用方法。1.实例2-1常用Windows数据类型演示(DWORD/LPSTR/CHAR/INT)本实定义了几个常用常量的Windows数据类型包括DWORDLPSTR和CHAR演示了如何使用它们进行了复制、比较大小等操作。在这程序中,使用了4种Windows数据类型,分别是LPSTRCHAR、DWORD和INT。LPSTR类型的数据是字符串,也就是字符指针,CHAR是字符,DWORD是32位的无符号整数,INT是32位有符号整数。程序行后会弹出4个对话框说明dwMax>dwOne是成立的iMax<iOne也是成立。dwMax与iMax的数值是一样的,dwOne与iOne的数值也是一样的。但是比较结果不同,是因为二者的数据类型不一样。2.为什么要使用Windows数据类型WindowsAPI函数数据结构等都是采用Windows数据类型。比如WindowsAPI数的入口参数、返回值等都是Windows数据类型。因此学习WindowsAPI程序设计必须要了解Windows数据类型。Windows数据类型与WindowsAPI的关系详见2.1.3小节。3.查看Windows数据类型的定义在VisualStudio可以查看数据类型的定义在数据类型的类型(比如“DWORD”)上单击右键,选择“转到定义,图2-1所。图2-1查看变量或数据类型的定义可以从SDK的头文件中看到各类型的类型定义。“INT”的定义如下:“DWORD”的定义如下:"CHAR"的定义如下:从中以发现,这些Windows数据类型都是从标准C的数据类型经过类型重定义而来。INT数据类是有符号整型,DWORD据类型是无符号整型。这就明了为什么在实例2-1中INT数类型的变量iMax实际是-1”而DWORD类型的变量dwMax实际是“4294967295,所以会出现如上的比较结果。4.最常见的Windows数据类型WindowsAPI中还会用到其他很多的Windows特有的数据类型。常用的类型说明如表2.1所示。表2.1 常用的本Windows数据类型Windows数据类型不止上表中列出类型,还包括其他很多种,主要有各种数据的指针,句柄无符号类型等读者可以查看数据类型的定义来了解Windows数据类型本小节第5点中给出了Windows数类型命名的规律在遇到新的数据类型时可以基本推论出数据类型的意义。读者也可以通过查看SDK文档来了解Windows数据类型的更多细节。5.Windows数据类型名命名的规律Windows数据类型的命名都很有规律。基本数据类型包括BYTE、CHAR、WRDSHORT、DOWRD、INT等。指针类型的命令方式一般是在其指向的数据类型前加“LP”或“P”,比如指向DWORD的指针类型为“LPDWORD”和“PDWORD”。各种句柄类型的命令方式一般都是在对象名前加“H”。Windows系统中有很多对象,所有表示一个对象的数据类型都是句柄,每一种对象都对应着一种句柄类型,比如与位图(BITMAP)对应的句柄类型为“HBITAP”,与菜单(MENU)对应的句柄类型为“HMENU”,与窗口(WINDOW)对应的句类型为“HWND”。无符号类型一般是以“U”开头,比如“INT”是符号类型,“UINT”是无符号类型,“LONG”是符号类型“ULONG”是符号类型等。2.1.2 indows数据类型与标准C数据类型的关系查看Windows数据类型定义可以看到所有的Windows数据型都是由C数据类型经过类型重定义得到的。如DWORD实质上就是unsignedong数据类型,32位的无符整型。WinDefHk定义如下:而将在Windows程序设计中经常用到的HANDE类型实质上是无类型指针void。在WinNT.h中有一系统的数据类型定义,与HANDLE有关的定如下:所有的Windows数据类型都是通过这种方式在SDK的头文件中进行定义的它们都是来源于标准C的数类型。而实上VC编译器是一个完整的C编译器,此外并没有过多的扩展。Windows数据类型也不是VC的内建类型,而从标准C类型重定义得到。2.1.3 indows数据类型与indowsAPIWindowsAPI函数的参数、返回值或一些重要的常量用的数据类型都是Windows数据类型。可以从WindowsAPI的定义中发现这一点。以几个WindowsAPI的定义例,例如本书第1章实例1-1中所使用的MessageBox函数,如下所示:MessageBox函数的返回值是int型的,是标准C数据类型,但是所有的参数都使用了Windows数据类型如HWND是一种Windows数据型用于表示窗口句柄LPCTSTR也是Windows数类型,表示字符串常量;UINT也是Windows数类型,为无符号整型。再如在本书的后续章节常会使用到的ReadFile函数,如下所示:使用了BOOL、HANDLE、LPVOID、DOWRDLPDWORD等Windows数据类型。最后一个参数则是指向OVERILAPPED构的指针。BOOL布尔型值可以是TRUE和FALSEHANDLE是文件句柄类型LPVOID是无类型指针,相当于void*,DWORD是无符号整,LPDWORD是指向DOWRD类型数据指针类型。WindowsSDK中也定义了很多类似于OVERIAPPED的结构体类型这些类型是WindowsAPI所不可缺少的部分。很多API数都是使用这样的结构体作为参数或返回结果。2.1.4 indows中的数据结构Windows中包含很多种数据结构类型在不同类型的API中会使用到不同的数据结构由于数据结构的数量众多,将在后续章节具体的实例中介绍实现每一种功能所使用的数据结构。数据结构通常会作为一些API的参数输入。WindowsAPI中的数据结构定具有一定的特点如将在第4章中使用到的WIN32_FILE_ATTRIBUTE_DATA数据结构的定义如下:Windows系统中类似于这样的数据结构类型定义很多也有很多的API函数使用到了这些数据结构类型读者应该对这样的数据结构定义有所熟悉这将在Windows应用程序设计中经常使用到。WindowsSDK中,结构体也有自己的命名规范。一般情况下,Windows系统中用全大写来命名结构体共用体并使_”来分隔单词在结构名加“LP或“P”表指向数据结构的指针。2.2indowsAPI的功能分类WindowsAPI所能实的功能包括很多方面,在进行应用程序的开发时,开发人员可能会使用到文件进程内存权限系统信息等系统的基本服务和系统管理类的API可能会用到图形用户界面、控件等函数和对象,可能需要在界面上绘制图像处理多媒体信息等,还包括进行网络通信开发等。2.2.1 系统基本服务系统基本服务是WindowsAPI最基本的内容,是最常使用到的程序接口。系统基本服务API包括以下几个方面。1.文件系统对文的基本操作包括文件的创建打开读写关闭删除文件属性的设置与获取,目录操作,以及磁盘分卷的操作,还包括镜像文件、加密文件系统等。2.内存管理主要内在的分配、共享、释放等内容,包括虚拟内存管理、分页机制、堆管理等。3.进程、线程和模块包括程主程序(exe)模动态链接库(dll)的编线程的基本概念线程创建、遍历、同步等操作;进程与权限;线程与纤程等内容。4.设备I/O、驱动程序控制包括备对象等基本概念。加载与卸载驱动程序,控制驱动程序,与驱动程序通信等。5.调试与错误处理包括何开发调试器程序运行错误的处理日志的记录Windows可执行文件的结构等。6.Windows系统信息包括册表的操作如打开注册表读取写入键值创建删除键还包括系统基本信息的获取和设置,如系统目录、系统版本、计算机名等。7.进程间通信包括用共享文件进行进程间通信的方法使用消息进行进程间通信的方法使用邮槽、管道等进行进程间通信的方法,使用网络共享进行进程间通信的方法。8.定时器与消息机制消息制是Windows系统中很重要的一种机制几乎所有的Windows应用程序都在与消息打交道而Windows的消息机制又是依赖于定时器的所以了解Windows消息机是学习Windows应用程序开发的重要内容。9.其他Windows的系统基本服务还包括性能监视电源管理索引与数据存储等也将在本书中有所涉及。10.实例2-2将系统目录信息写入systemroot.txt本实使用了Windows系统基本服务中的部分API,实现将系统目录路径写入文件中。在这里不对实现原理做过多的解释只是使读者对Windows系统服务API有初步的了解后续章还将详细介绍这些程序接口的使用方法。运行序,在程序所在的目录会生成文件“systemroot.txt”,文件容为系统目录。2.2.2 系统管理系统理是Windows系统中很重要的内容Windows系统提供了以下方面的API应用程序开发人员使用包括管理控制台接口程序安装系统恢复任务调度Windows运程管理。2.2.3 用户界面用户界开发是Windows应用程序开发的重要内容Windos用户界面要包括两个部分,WindowsShell和Windows图形用户界面Windows图形用户界面包括窗口对象的相关内容,界面资源,控件、用户数据交换(粘贴板等)和用户输入的处理。1.窗口化包括一些基本数据概念和对象:窗口类、消息对列、窗口过程(消息处理函数、窗口属性等。主要括的API有窗口类注册的函数、窗口建立与关闭函数、窗口属性修改函数等。2.资源资源是Windows应程序中很重要的一项内容在可执行文件中专门有用于存储资源的节。这里所说的资源是界面资源包图标菜字符串版本信息对话框态光标插入号(Carets)等。资源处理涉及众多API函数。3.用户输入处理包括对话框、键盘加速器(快捷键、键盘输入、鼠标输入、原始数据输入等。这些概念是程序通过用户界面与用户进行交互的基本概念。4.数据交换包括Atom(包括若干字符串和标识符粘贴板数据复制动态数据交接等基本概念,是用户和应用程序通过用户界面进行数据交换的主要载体。5.Windows图形界面通用控件Windows系统提供了不少于30种的控件供应用程序使用,其中最常用的几种包括Edit控件(文本框、Button控件(按钮、ListView控件(列表、ToolTp控件(提示框、ComboBox控件(下拉选择框、Tree-View控件(树、Rich-Edit控件(多功能文本框、Tab控件(分页、Proces控件(进条)等。6.WindowsShellWindows桌面浏览器(explore.exe)的功能强大,WindowsShell应用程序可以利用WindowsShell桌面的程接口达到管理系统定制图标和默认程序扩展桌面功能等目的。有关面及控件的使用方法与原则将在第9章详细介绍。WindowsShell程序设计相对独立,将在第12详细介绍。7.实例2-3窗口创建以及消息处理basic.c本实演示Windows用户界面API的基本功能使读者对Windows应用界面开发有最基本的认识,本实例详细的实现原理还会在第9章中详细介绍。本实例使用了与图形用户界面相关的一些函数,目的在于使读者对用户界面接口API有一个初步的认识实例中首先注册了窗口类然后创建了一个窗口创建窗口时指定的窗口的属性和窗口消息的处理函数。函数消息的处理函数大多调用系统默认函数来处理。2.2.4 图像和多媒体Windows的图像引擎和多媒体编程有多种接口,包括最基本的GDI、GDI+,以及更高级的OpenGLDirectX等图像引擎编程接口DirectX和OpenGL游戏开发动画制作等方面应用比较广泛,使用它们进行应用程序开发需要专门的SDK本书只讲解GDI,对一般的应用程序开发,已经足够使用。GDI的基本概念包括图像(Image)、位图(Bitmaps、笔(Pen)、画刷(Brush)、文本和字体(TextandFonts)线(Line)区域(Regions)、形状(Shapes)等。基本的功能是对显示设备进行控制、获取和修改相关配置,在计算机屏幕上显示用户所需要显示的内容。GDI涉及众多结构、API函数,将在第13章节详细介绍。2.2.5 网络用户用WindowsPI可以开发基于各种网络协议的应用程序,例如TCP\UDPSocket、HTTPDHCP、RPC、QOS、蓝牙,以及传真、点对点文件传输、即插即用设备管理等。还可进行网络管理包括网络的基本信息使用IPelper获取网配置和网络信息、进行网络监视等。同时软还提供了进行网络安全编程的部分接口主要是防火墙Windows防墙API,以及一些Windows自带的网络应用程序的接口,包括IE、Outlook等。本书第14章将详细绍网络程序设计的相关内容。2.2.6 系统安全包括统的授权与认证登录权限管理加密安全管理策略等内容本书将主要介绍用户管(包括用户增加修改设置删除等和Windows安全对(任何具有访问控制机制的对象如文件进程和安全操作主(线程之间的安全认证机制及权限设置对程序行为的影响。第17章进行了相关的介绍。2.2.7 其他功能WindowsAPI能实现的功能还有很多限于篇幅不能全部介绍有一些内容本书未涉及,但是WindowsAPI也提了相关接口。1.数据存储和访问、数据库包括软的“动态数据存取组件”技术(MDAC,包含了ADO、ODBC)OLE数据库、XML标准、微软XML、可扩展存在引擎等多方面内容。主要是Windows系统内的数据库文件、Windows.统对数据库的访问接口等技术。2.消息与协作消息协作大多是Windows系统自带的一些应用程序所提供的开发接口其中最主要的内容“协作数据对象(CDO)CDO包括了若干种Windows数据传输典型应用包括Mssager(MSN)、邮件SMTP(Outlook)应用接等。3.Web开发IIS(IntemetInformationSerer,互联网信息服务)等应用程序提供的开发接口,使用户可以直接在Windows平台上进行Web开,开发的程序运行于ns框架下。“数存在与访问”“消息与协作”“Web开发”等都以归为COM开发的范围内。COM是Windows应用程序接口的一种具有固定的接口模式大多是Windows系统自带的应用程序所提供的开发接口的集合。2.3indowsAPI核心DLL在Windows的系统录中存在着很多的动态链接库文件(DLL文件这些DLL文件中包括了WindowsAPI函数可执行程序DLL将各函数“导出”这样应用程序就可以到DLL中的函数地址,当应用程序调用WindowsAPI,程序会运行到DLL。API函数主要存在于几个核心的动态连接库文件中。Keme132.dll是最重要的DLL,Windows系统最主要的系统服务API函数都存在于Kerne132.dll中User32.dll主要包括图形用户界面中所使用到的一些函数接口。GDI32.dll中,主要包括Windows图引擎中的接口函数。当用调用一个API时系统通过程序文件中的导入表结构找到需要调用的API函数位于哪个DLL,确定函数的地址,以便应用程序可以成功调用API函。2.3.1 Kerne132.dllKeme132.dll包括了系统基本服务中最基本的API函如文件系统进程与线程内存管理等。WindowsXPSP2系统中,Keme132.d11有949个导出函数,例如,CreateFileA、CreateProcessAOpenThredSetFilTime等书将在后续章节中通过实例介绍这些API的使用。2.3.2 User32.dllUser32.dll是Windows图形用户界面的主要支持。一些重要的图形用户界面函数由User32.dll函数导出。WindowsXPSP2系统中,User32.dll有732个导出函数,例如CreateWindowExW、RgisterClassA等。2.3.3 Gdi32.dllGd132.dll是WindowsGDI应用程序设计接口Gdi3.dll导出了此相关的若干函数,如GetTextColor、LineTo、TexOutA等。2.3.4 标准C函数标准C程序是一种标准任何支持C语言应用序开发的系统都应该提供C语言库函数的调用在系统环境下使用标准C进行程序开发时用户所使用的库函数实际上是由操作系统提供的正是由于各个主流操作系统都提供了一套标准C库所定义的函数接口标准C函数库才会有如此广泛的跨越操作系统平台所以C程序仍然依赖于操作系统开发人员为其实现接口而C库函数的实现仍然依赖于作系统提供的调用接口如标准C函数fopen函数在Windows系中的实现就依赖于APICreateFile函数(CreateFile实现了文件的创建和打开等操作。Windows系统的C标准库函数接口主要存在于crtdll.dll中实际上C标准函数库必须由操作系统为其提供接口,否则使用标准C开发的程序无法在特定的系统上运行。WindowsXPSP2系统中,crtdll.dll有526个导出函数,如fopen、pintf.strlen等。2.3.5 其他Dll当然Windows系统中的DLL件远远不止这几个,Windows系统提供了非常丰富而且功能强大的API,上文已经介绍了WindowsAPI所主要依赖的几个DLL,其的DLL库件由于过于庞杂就不一一介绍将在后续的章节中有所涉及读者只需要了解调用WindowsAPI的基本原理就可以了。2.4Unicode和多字节Windows既可以使用Unicode字符集又可以使用传统的字符(如多字节编码来实现对多种语言的支持以适应国际市场的要求与传统的字符集编码相比Unicode是世界通用的字符编码标准,使用16位数据表示一个字符,一共可以表示65535种字符,可以包括现代计算机中所使用的所有字符,包括各种字母、文字、在出版业中使用的特殊符号等。传统字符集,如WindowsASNI字符集,使用8位数据或将相邻的两个8位的数据组合在一起表示特殊的语言字符。Windows系统采用了ASNI字符的扩展方式,如果一个字节是负数则将其后续的一个字节组合在一起表示一个字符这种编码方式的字符集也称“多字节”字符集。在Windows系统中,Unicode字符编码和多字节字符编码都可以使用。1.实例2-4Unicode与多字节编码演示本实演示不同宽度的字符串的初始化,并将字符串输出进行比较。在本实例中一共使用了3种类型的字符串变量每种类型的字符串变量的初始化是不同的,如表2.2所示。本实例首先使用“多字节”方式进行编译可以使用二进制编辑器来查看编译得到的可执行文件上例中定义的字符串分别存储为以下形式使用二进制编辑器查看可以从exe可执行文件中找到如下信息。读者可以对照ASCII码表查看正好是“ThisisaUnicoeString;”使用Unicode方式的六进制编码。是“ThisisntaUnicodeString;”使用ASCII方式的十进制编码。是符“ThistringsUnicoderntependsontheption.”的ASCI方式的十六进制编码,说明编译配置没有使用Unicode。之后是“<字符编码1>”和Unicode编码、“<字符编码2>”和“<字符编码3>”的多字节编码。对汉字字符,两种编码的方式是不同的,如“字符编码”四个字,两种编码分别为:和读者可以分析设置使用Unicode字符集后编译完成的可执行文件与设置为多字节字符集后编译得到的可执行文件有什么不同。2.在工程配置中选择编码方式设置方法是在Visualtudio工程属性中选择“配置属性”→“常规”→“字符集”选项中进行选择。2.4.1 W版本和A版本的APIWindows支持Unicode和ASCII编码的字符。Windows系统API凡是以字符串为参数的很多具有W和A两个本以实现两种不同编码的字符处理。下面以MessageBox例介绍两种不同版本API函数的使用在User32.dll中导出函数实际上没有MessageBox只有MessageBoxA和MessageBoxW这两者是同一个API实现了同样的功能。不同的是,MessageBoxA以多字节字符串作为参数输入,MessateBoxW以Unicode字符串作为参数输入。可以从User32.dll的导函数看到两个不同版本的API函数。在PlatformSDK中,MessageBox函数声明所在的头文件中发现如下定义(以下代码来自于MicrosoftPlatfomSDK):可以看到在程序行编译和连接时如果序在UNICODE环境下用MessageBoxW,否则使用MessageBoxA。软件发人员可以自行设定使用Unicode编码或都多字节编码文件不影响程序的正常功能。但如果在编写程序时使用的字符集与代码中使用的函数不一致定义的字符串变量不兼容,将会引起编译错误或者运行程序显示乱码甚至可能引起程序运行错误这一点需要引起注意。2.4.2 Unicode与ASGII的转换Windows专门提供了若干个API来实现对字符编码的转换工作WieCharToMultiByte、MultiByteToWideCharUnicodeToBytes函数可以完成这工作。WideCharToMultiByte函数将Unicode字符转换多字节字符串,以适应A本的API,MultiByteToWideChar函数将字节字符串转换为了Unicode字符,以适应W版本的API的参数形式要。2.5对Windows程序设计规范的建议每个序员都有自己的规范化编程习惯代码的规范不是本书的重点所以这里只给出一些微软经常使用代码规范MSDN的示例中SDK的头文件和例子中几乎都是使用的这种方法。变量名:通常采用所谓的“匈牙利命名法”,变量名由“类型缩写(小写)”+“变量描述(单词首字母大写”构成,如符串类型的变量可以命名为szFileName,DWORD类型的数据可以命名为dwFileSize,指类型可以命名为lpBuffer,句柄类型的变量可以命名为hLogFile等。函数:各单词的首字母大写,如EnumerateFilesInDrectory、SowFileSize等。类型:全大写,各单词以下划线分隔,如WIN32_FILE_ATTRIBUTE_DATA、DWORD、HANDLE等。常量同类型名的命名方式。宏:与类型名命名方式相同,有的也与函数名命名方式相同。大括与代码段一般大括号独立占一行大括号内的代码段缩进如果代码段仅一行(如if-else后的语句,也建议使用大括号。在调用或定义函数时,如果函数太长,可以分行写,将每个参数写一行。一般多于3个参数的函数需要分行写,以美观和方便阅读为原则。在本的示例中,都将尽量使用这些规范化的方式。第3章开发工具配置与使用程序的发依赖于开发工具。WindowsAPI函数是C语言形式的,并且Windows本机应用程序绝大多数是使用C或者C++语言开发的因此C\C++编译器和链接器等程序生成工具是程序开发必备的工具。VisualC和VisualC++是Windows平台下完整的C和C++程序生成工具。PlatformSDK提供了使用WindowsAPI所需的头文件和库文件,同时也提供了部分工具本章将讲解如何使用这些程序构造工具以及如何使用微软提供的头文件与库文件来构造Windows应用程序。大型程序一般有很多代码文件使用nmake工具可以批量构造程序使开发人员无需对每个文件逐一进行编译。makefile是nmake工具的配置文件,包含nmake工作需的输入参数。本章将会介绍如何使用nmake工具,及如何编写makefile。此外程序开发与调试也密不可分所以调试器的使用也是本章所关注的内容本章将会讲解WinDbg的使用。另外在实际的工程开发中,集成开发环境(IDE)可以大大提供代码编辑的效率和程序构建的效率同时也为开发过程中代码的调试提供了很大的方便本章也会讲解IDE的使用技巧。这些具都可以方便地从微软的网站上免费获得在开始本章的学习前请读者先按照第1章的方法装VisualC++(VisulStudio)和PlatformSDK。3.1使用isualC/C++编译链接工具在第1章已经介绍了如何安装Visual++成版和Visualtudio专业版等开发工具。VisualC++的安装目录(VisualStudi02008的默认安装路径是C:\ProgramFiles\MicrosoftVisualStud09)下的“VC\bin”目中包含cl.ee、link.exe、lb.exerc.exe等可执行文件“VC\Include”目录中包含stdlib.hstio.h等头件这些都是标准C头文件;在“VC\lib”目录中则包含lib文件和obj文件这些文件在程序编译和链接过程中具有重要作用。cl.exe文件是VisualC\C++的编译器,它将程序源代码文件编译为obj文件。rc.exe文件是资源编译器。工程项目中的.rc文件中包含了对程序中所使用资源(菜单图标等的描述rc.exe将c格式的文件编译为.res文件供链接器链接到可执行文件中。link.exe是Windows平台的链接器它将cl.exe编译生成的obj文件资源编译器生成的.res文件,以及lib目录下的lib文件等链接成可执行的exe文件、dll文件等。3.1.1 编译器cl.execl.exe的功能是将源代码文件编译为可供链接器使用的obj对象文件。cl.exe命令行参数形式如下:1.命令行参数各命令行参数的意义如下。(1)命令行中的“option”是指一个或多个编译选项。在指定选项时,需要在选项前加正斜杠(/)或一个短划(_有一些选项还会带有参数使用“”来指定选项的参数比如“/sybsytem:windows,5.0”是一个编译选项,表示可执行程序执行所依赖的子系统是Windows(Win32图形用户界面的应程序),版最低5.0Winows2000)。选项名区分大小写(/HELP选项除外)。而且除了llink选项之其他选项的顺序没有要求在编译时所指定的所有选项都将应用于用户指定的所有源文件。option命令行参数是可选的。(2)命行中的“file”是一个多个所需要编译的源文件也可以是.obj文件或库文件cl.exe编译源文件并将.obj件和库的名称传递给链接器file参数是编译器的必需参数。(3)“lib”选项用于指定一个或多个库名cl.exe直接将这些名称传递给链接器lib是cl.exe可选参数。(4)“command-file”,包含多个选项和文件名的文件,为可选参数。(5)“link-opt”一个或多个链接器选项CL将这些选项传递给链接器也是可选参数。本书第1章的实例1-1中,已经使用了cl.exe来编译文件。在编译start.c源文所使用的cl.exe命令行如下:其中“c-DCRTAPIl=cdecl-DCRTAPI2=cdel-nologo-GS-D_X86=1-DWIN32-DWIN32-W3-_vmNT-D_WIN32INNT=Ox0500D_WIN32E=Ox0500-DWINVR=Ox0500DMT-MTd/Gz/Fo"STRTBIN\\"/Fd"STARTBJN\\""是编译选项(option数“tart.c”是源文件(file参数)。有使用lib、comand-file、link-opt等命令行参数。2.编译器选项option参数是cl.exe的编译选是cl.exe命令行参数中最复杂也是最常使用的。下面将介绍一些常用的编译选项。(1)与码生成有关的选项如表3.1所这选项将影响编译完成后生成的机器代码。(2)与调试有关的编译选项如表3.2所示。/27、/Zi/ZI这3个选项是对程序进行调试时所必须的选项。同时注意,在生成调试版本的程序时,需要指定/Od选项以用优化。(3)与程序化有关的选项如表3.3所示。优化选项将影响编译器对代码的优化,是选择代码体积最小还是选择运行速度最快等需要使用这些选项。(4)与生成输出文件有关的选项如表3.4所。输入文件在参数中需要使用字符串来指定其路径字符串使用双引号"")扩起来/fd"BIN\\"注意字符串的转意字符如果需要使用所斜扛表示文件路径,需要使用"\\"。(5)与预处理器有关的选项如表3.5所示。这些选项将影响预处理器的运行,比如通i出D选项以达到与在源代码中使用#define定义基本相同的效果。(6)与接有关的选项如表3.6所示编译器可以调用链接器向链接器传递调用参数。/link选项完成这项功能,还可以指定堆栈的大小,创建动态链接库等。(7)与预编有关的选项如表3.7示,表3.7中的编译器选项会影响预编译结果。(8)与程序语言有关的选项在表3.8中详细列出比如/vmb/vmg选项将影响编译器对类成员指针的处理方法;/vmm、/vms、/vmv将会影响类成员继承方式;/Za、/Ze选项表示是否支持微软的语言扩展,还是只支持标准C/C++。/Zp选可以指定结构中的成员对齐方式这将影响到生成的程序中结构体的大小在一些协议头的处理中/Zp选项将非常有用。(9)其他选项。这些选项的影响是多方面的,不太好分类。包括显示帮助信息、设置警告等级、设置版本信息等,详细说明见表3.9。表3.1~表3.9包括了大多数VC/C++编译器选项是开发人员在进行程序开发时最经常使用到的选项但是这并不是全部编译选项如果读者需要使用到其他的编译选项可以查阅MSDN。3.1.2 资源编译器c.exeWindows应用程序中图标菜单位图等是以资源的形式存在的开发人员也可以自己定义资源类型如果一个程序使用了资源那么它在构建时需要对资源进行编译程序所使用的资源会在资源脚本文件(rc)中进行描述编译时资源编译器会将rc文编译为可链接的.res文件。资源脚本文件中描述了资源的类型、名称、文件名等信息。资源中可以包括对话框字符串图标位图鼠标指针样式工具条等资源文件中大多和图形用户界面有关,本书将在第9章中介绍源脚本文件的格式。1.命令行参数使用如下方式在命令行中运行rc.exeoptions是编译选项。script-file是需要编译的资源脚本文件。用户可以使用如下方式调用:2.资源编译器选项rc.exe可使用的选项如表3.10所。实例3-1一个使用rc.exe进行资源脚本文编译的命令行实例。3.实例3-1编译资源start.rc以下是start.rc文件内容。打开“VisualStudio命令提示”,切到start.rc所在的目录,运行:将会在屏幕上有如下输出:编译完成后会在目录下生成start.res文件就是编译完成生成的可供链接器使用的资源文件。在程序链接时,会使用到此文件。3.1.3 链接器link.exe在程序编译完成后,生成的文件是以obj为扩展名的对象文件,link.exe将对象文件和库链接起来以创建可执行程序文件或动态链接库文件的工具。link.exe的输入件包括obj文件、lib文件、exp文件、def文件、res文件、txt文件、ilk件。输出文件是exe文件、dll文件、ss文件可执行程序文件。1.命令行参数link.exe行参数如下:参数包括选项和文件名,选项和文件名可按任意顺序指定。link会首先处理选项,然后是文件。各参数间使用一个或多个空格或制表符来分隔。2.输入文件参数中的files是指链接器的输入文件。用户可以使用文件名指定绝对路径或相对路径,可在文件名中使用通配符。如果用户指定的文件名没有扩展名,则假设扩展名为obj。link.exe对文件格式的判断不是根据文件扩展名的,而是判断文件的内容。比如实例1-1中start.c完成编译会生成start.obj文件然后将start.obj与系统库文件链接起来,生成可执行文件。命令行参数为:注意,在实例1-1中这样一行代码:如果在输入文件中指明了User32.lib,那么这一行是没有必要的。但如果将这一行代码去掉,代码文件中又不包括上面的这一行,则编译器会报错。3.运行结果link.exe返回零值表示成功。如果运行成,会在/out选项指定的输出路径中生成可执行文件或动态链接库。4.链接器选项选项需加“选项说明符(一个短划(_或一正斜杠(/))然后是该选项的名称如果选项带参数参数在冒号()后指定选项的参数如果参数是数值可以使用十进制、或C语言表示法。与编译器cl.exe不同,链接器的选项名及其关键字或文件名参数不区分大小写,但用作参数的标识符区分大小写。常用的link.exe的链接选项如表3.11所示。3.1.4 其他工具1.BSCMAKE.EXE生成一个信息文件(.bsc),用于浏览程序中的符号(类、函数、数据、宏和类型)信息。可以在集成开发环境的浏览窗中查看这些信息(.bsc文件也可以在IDE中生成。2.LIB.EXE用于生成COFF格的lib库文件,可用于创建导出文件和引用导出定义的导入库,在为其他开发人员提供开发接口时非常有用。3.EDITBIN.EXE可用编辑COFF格式的二进制文件。4.DUMPBIN.EXE可显示COFF二进制件的有关信息,比如符号表等。比如,使用dumpbin.exe分析第1章的start.exe。选择“工具”→“VisualStudio命令提示”切换到start.exe所在目录,运行:在bin_info.txt中包含可执行文件中非常丰富的信息,包括文件头信息节信息等。5.NMAKE.EXE程序护实用工具,读取和执行生成文件。将在3.3节中详细介绍nmake的使用。6.ERRLOOK.EXE错误查找工具与GetLastErrorAPI函数配使用在程序调试时起到了很多的作用,用于分析WindowsAPI的调用错误。图3-1示,在VisualStudioIDE中,可以过菜单“工具”→“错误查找”来使用。3.1.5 编译链接工具依赖的环境变量1.环境变量的概念环境变是一组系统或用户给应用程序设置的全局性的变量通常用于保存各应用程序都会使用到的系统配置信息。应用程序可能会根据不同的环境变量配置产生不同的运行结果。操作系统启动后,会专门分配一块内存用于存储环境变量。之所以称之为“变量,是因为其值是可以改变的系统上所有运行的程序都可以获取或设置环境变量进程创建时进程可以获取系统环境和当前登录用户的环境变量每个进程也可以有自己私有的环境变量因此环境变量类似于一种在整个系统范围内“全局
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年初级会计职称考试模拟试题及详细答案解析
- 危险化学品重大危险源专项应急演练方案
- 5G基站基础施工方案
- 2026‑2031年中国海南房地产行业市场调查研究及发展前景预测报告
- 2025年软件行业技术部程序员代码编写规范手册
- 测绘信息安全培训
- 英语(五年级上册)-U3-L2课件 Yuan Longpings Dream
- 2026-2027学年秋季学期苏教版(新教材)八年级上册生物学教学计划及进度表
- 工程复工报告
- 广东大湾区一模-2026届高三-2026年1月-生物-答案41
- 深圳市灵活就业协议书范本
- 精卫填海成语神话故事
- 高一数学教材同步知识点专题详解(苏教版必修第一册)3.2基本不等式(原卷版+解析)
- DZ∕T 0130-2006 地质矿产实验室测试质量管理规范(正式版)
- 施工进度计划横道图-自动绘制
- GB/T 42167-2022服装用皮革
- PPT供应链协同管理蓝图规划项目整体解决方案
- 陕西国防科技工业职业技能大赛(电工赛项)理论备考试题库-上(单选题汇总)
- 失智老人及其照护护理课件PPT
- 氢气往复式压缩机培训
- YS/T 853-2012锆及锆合金铸件
评论
0/150
提交评论