《windows程序设计》PPT课件.ppt
Windows程序设计基础程序设计基础第六章第六章 文件操作和内存映射文件文件操作和内存映射文件操作文件是每个应用程序都要做的事情。操作文件是每个应用程序都要做的事情。保存和获取信息方式:磁盘文件和注册表保存和获取信息方式:磁盘文件和注册表6.1文件操作文件操作文件的输入输出是操作系统的重要部分。文件的输入输出是操作系统的重要部分。CFile类:读写和管理磁盘文件的类类:读写和管理磁盘文件的类API函数:与底层设备函数:与底层设备(COM口、设备驱动口、设备驱动)交互交互 创建和读写文件创建和读写文件使用使用API函数读写文件时,首先使用函数读写文件时,首先使用CreateFile函数创建文件对象函数创建文件对象(打开文件打开文件),调用成功返回文,调用成功返回文件句柄;然后以此句柄调用件句柄;然后以此句柄调用ReadFile和和WriteFile函数,进行实际的读写操作。最后调函数,进行实际的读写操作。最后调用用CloseHandle函数关闭不再使用的文件对象函数关闭不再使用的文件对象句柄。句柄。打开和关闭文件打开和关闭文件HANDLECreateFile(LPCTSTRlpFileName,/要创建或打开对象的名称要创建或打开对象的名称DWORDdwDesAccess,/文件存取方式文件存取方式DWORDdwShareMode,/共享属性共享属性LPSECURITY_ATTRIBUTESlpSecurityAttributes,/安全安全DWORDdwCreationDisposition,/文件存在或不存在时操作系统采取行动文件存在或不存在时操作系统采取行动DWORDdwFlagsAndAttributes,/新文件的属性新文件的属性HANDLEhTemplateFile);/一个文件模板的句柄一个文件模板的句柄lpFileName:是以空值结尾的字符串的指针,包含要创建、打开或截取的文件、管:是以空值结尾的字符串的指针,包含要创建、打开或截取的文件、管道、通信资源、磁盘设备或控制台的名称。道、通信资源、磁盘设备或控制台的名称。dwDesAccess:指定文件的输出类型,具体见表所示。:指定文件的输出类型,具体见表所示。值值意意义义0允许应用程序查询设备属性,而实际上不访问设备允许应用程序查询设备属性,而实际上不访问设备GENERIC_READ指定读取属性,可以从文件中读取数据,可以移动文件指针指定读取属性,可以从文件中读取数据,可以移动文件指针GENERIC_WRITE指定写入属性,可以向文件中写入数据,可以移动文件指针指定写入属性,可以向文件中写入数据,可以移动文件指针dwShareMode:确定是否且如何共享这个文件,可以采用:确定是否且如何共享这个文件,可以采用下下表所示的值。表所示的值。值值意意义义0禁止文件共享禁止文件共享FILE_SHARED_DELETE仅用于仅用于Windows2000中,后续对象打开操作仅限于删除操作中,后续对象打开操作仅限于删除操作FILE_SHARED_READ可以对文件执行其他的打开操作,以进行读取可以对文件执行其他的打开操作,以进行读取FILE_SHARED_WRITE可以对文件执行其他的打开操作,以进行写入可以对文件执行其他的打开操作,以进行写入lpSecurityAttributes:是指向:是指向SECURITY_ATTRIBUTES结构的指针,指定了结构的指针,指定了目录的安全属性,但要求文件系统支持如目录的安全属性,但要求文件系统支持如NTFS的格式。的格式。Windows98不支持此不支持此属性,在函数调用时应设置为属性,在函数调用时应设置为NULL。dwCreationDisposition:确定文件存在或不存在时所采取的动作。:确定文件存在或不存在时所采取的动作。这个参数必须为这个参数必须为下下表所示的值之一。表所示的值之一。值值意意义义CREATE_NEW创建新文件。如文件已存在,函数调用失败创建新文件。如文件已存在,函数调用失败CREATE_ALWAYS创建新文件。如文件已存在,覆盖旧文件创建新文件。如文件已存在,覆盖旧文件OPEN_EXISTING打开文件。如文件已存在,函数调用失败打开文件。如文件已存在,函数调用失败OPEN_ALWAYS打开文件。如文件已存在,函数创建一个文件,其打开文件。如文件已存在,函数创建一个文件,其dwCreationDisposition属性是属性是CREATE_NEWTRUNCATE_EXISTING打开文件。一旦打开,就截断文件,使其大小为零。调用打开文件。一旦打开,就截断文件,使其大小为零。调用过程必须至少用过程必须至少用GENERIC_WRITE权限打开。如果文件已权限打开。如果文件已存在,函数调用失败存在,函数调用失败dwFlagsAndAttributes:指定文件的属性和标志。该参数的属性值较多,除:指定文件的属性和标志。该参数的属性值较多,除属性属性FILE_ATTRIBUTE_NORMAL外,都可以任意组合。表外,都可以任意组合。表中中列出了较常用列出了较常用的几个,的几个,属属性性含含义义FILE_ATTRIBUTE_ARCHIVE文件是存档类型,可用于备份或删除文件是存档类型,可用于备份或删除FILE_ATTRIBUTE_ENCRYPTED文件或目录是加密的。如果指定属性有文件或目录是加密的。如果指定属性有FILE_ATTRIBUTE_SYSTEM,那么此标志没有作用,那么此标志没有作用FILE_ATTRIBUTE_HIDDEN文件是隐藏的文件是隐藏的FILE_ATTRIBUTE_NORMAL文件没有属性,此标志只有在单独使用时才有效文件没有属性,此标志只有在单独使用时才有效FILE_ATTRIBUTE_READONLY文件是只读属性文件是只读属性FILE_ATTRIBUTE_SYSTEM文件为系统文件文件为系统文件hTemplateFile:用于存取模板文件的句柄。模板文件为正在创建的文件提供扩展属性。:用于存取模板文件的句柄。模板文件为正在创建的文件提供扩展属性。返回值返回值如果函数调用成功则返回打开文件的句柄。如果调用前文如果函数调用成功则返回打开文件的句柄。如果调用前文件已经存在,且件已经存在,且dwCreationDisposition参数使用参数使用CREATE_ALWAYS或或OPEN_ALWAYS,则返回,则返回ERROR_ALREADY_EXISTS。函数调用失败则返回。函数调用失败则返回INVALID_HANDLE_VALUE。读取、写入、移动和删除文件读取、写入、移动和删除文件在第一次打开文件时,在第一次打开文件时,Windows在文件的开头存放一个文在文件的开头存放一个文件指针,文件指针所指的位置就是下一次读取或写入的地件指针,文件指针所指的位置就是下一次读取或写入的地方。随着字节的读取或写入,方。随着字节的读取或写入,Windows也相应增加文件指也相应增加文件指针。应用程序可以利用函数针。应用程序可以利用函数SetFilePointer来移动文件指针来移动文件指针的位置。的位置。执行读取和写入的函数是执行读取和写入的函数是ReadFile和和WriteFile。这两个函。这两个函数在文件指针位置处读取和写入指定数量的字节数,并不数在文件指针位置处读取和写入指定数量的字节数,并不进行格式化数据。下面对这两个函数分别进行介绍。进行格式化数据。下面对这两个函数分别进行介绍。读取文件读取文件BOOLReadFile(HANDLEhFile,/文件指针文件指针LPVOIDlpBuffer,/数据缓冲数据缓冲DWORDnNumberOfBytesToRead,/读取的字节数读取的字节数LPDWORDlpNumberOfBytesRead,/接收要读取的字节数接收要读取的字节数LPOVERLAPPEDlpOverlapped/覆盖缓冲覆盖缓冲);读取文件读取文件hFile:是指向要打开文件的指针。:是指向要打开文件的指针。lpBuffer:是接收来自文件数据缓冲区的指针。:是接收来自文件数据缓冲区的指针。nNumberOfBytesToRead:指从文件中读取的字节数。:指从文件中读取的字节数。lpNumberOfBytesRead:用于接收要读取的字节数。:用于接收要读取的字节数。lpOverlapped:是指向:是指向OVERLAPPED结构的指针,如结构的指针,如果果hFile所指的文件是用所指的文件是用FILE_FLAG_OVERLAPPED创创建的,则需要用到此结构。如果用建的,则需要用到此结构。如果用FILE_FLAG_OVERLAPPED创建创建hFile,而且,而且lpOverlapped不为不为NULL,则读取操作从,则读取操作从OVERLAPPED结构所指的偏移量结构所指的偏移量位置处开始,函数位置处开始,函数ReadFile可能在完成读取操作之前返可能在完成读取操作之前返回。如果未用回。如果未用FILE_FLAG_OVERLAPPED创建创建hFile,而且而且lpOverlapped不为不为NULL,则函数,则函数ReadFile在完成读在完成读取前不会返回。取前不会返回。写入文件写入文件BOOLWriteFile(HANDLEhFile,LPCVOIDlpBuffer,DWORDnNumberOfBytesToWrite,LPDWORDlpNumberOfBytesWritten,LPOVERLAPPEDlpOverlapped);此函数将移动文件指针到指定的位置。此函数将移动文件指针到指定的位置。DWORDSetFilePointer(HANDLEhFile,/文件句柄文件句柄LONGlDistanceToMove,/要移动距离要移动距离PLONGlpDistanceToMoveHigh,/移动距离高移动距离高32位,一般位,一般NULLDWORDdwMoveMethod);/运动模式运动模式移动文件指针移动文件指针hFile:是指向要打开文件的指针。:是指向要打开文件的指针。lDistanceToMove:指移动文件指针的字节数,若为正值则在文件中把指针向前移动,若:指移动文件指针的字节数,若为正值则在文件中把指针向前移动,若为负值则向后移动。为负值则向后移动。lpDistanceToMoveHigh:要移动的:要移动的64位距离的高位距离的高32位指针。如果此参数值为位指针。如果此参数值为NULL,则,则函数只能在小于函数只能在小于2322的文件上使用。如果指定了这个参数,文件的大小最大可为的文件上使用。如果指定了这个参数,文件的大小最大可为2642。dwMoveMethod:指定了文件移动的起始点,可以为:指定了文件移动的起始点,可以为下下表所给出的值之一。表所给出的值之一。属属性性含含义义FILE_BEGIN起始点为零或文件的开始起始点为零或文件的开始FILE_CURRENT文件指针的当前值为起始点文件指针的当前值为起始点FILE_END当前文件末尾为起始点当前文件末尾为起始点返回值返回值如果函数调用成功,则返回文件指针的低如果函数调用成功,则返回文件指针的低32位。如果参数位。如果参数lpDistanceToMoveHigh不为不为NULL,则返回文件指针的高,则返回文件指针的高32位。若函数调用失败则返回位。若函数调用失败则返回0 xFFFFFFFF。在每次调用函数在每次调用函数CreateFile之后,在退出作用之前都应调用函数之后,在退出作用之前都应调用函数CloseHandle,关闭打开的对,关闭打开的对象句柄,使前面的函数调用有效。这个函数使得对象句柄失效,并减少对象句柄计数和执行象句柄,使前面的函数调用有效。这个函数使得对象句柄失效,并减少对象句柄计数和执行对象保存检查。如果关闭对象的最后一个句柄,则从系统中删除对象。对象保存检查。如果关闭对象的最后一个句柄,则从系统中删除对象。DeleteFile此函数用来删除一个已存在并指定路径的文件。此函数用来删除一个已存在并指定路径的文件。BOOLDeleteFile(LPCTSTRlpFileName);参数参数lpFileName:是一个指向字符串的指针,字符串中存储的是包含具体路径的文件名。:是一个指向字符串的指针,字符串中存储的是包含具体路径的文件名。返回值返回值如果函数调用成功则返回如果函数调用成功则返回TRUE,否则返回,否则返回FALSE。删除文件删除文件BOOLLockFile(HANDLEhFile,/文件指针文件指针DWORDdwFileOffsetLow,/加锁的开始位置加锁的开始位置DWORDdwFileOffsetHigh,DWORDnNumberOfBytesToLockLow,/加锁区域大小加锁区域大小DWORDnNumberOfBytesToLockHigh);解锁函数解锁函数UnlockFile和它参数一样。和它参数一样。锁定文件和解锁锁定文件和解锁CloseHandle此函数用于关闭目前打开的对象句柄。此函数用于关闭目前打开的对象句柄。BOOLCloseHandle(HANDLEhObject);参数参数hObject:对象的句柄。:对象的句柄。返回值返回值如果函数调用成功则返回如果函数调用成功则返回TRUE,否则返回,否则返回FALSE。关闭文件句柄关闭文件句柄此函数用于将文件从一处移到另一处。此函数用于将文件从一处移到另一处。BOOLMoveFile(LPCTSTRlpExistingFileName,LPCTSTRlpNewFileName);参数参数lpExistingFileName:为要移动的文件名及其路径。:为要移动的文件名及其路径。lpNewFileName:是移动目的地的文件名及其路径。:是移动目的地的文件名及其路径。返回值返回值如果函数调用成功则返回值为如果函数调用成功则返回值为TRUE,否则返回,否则返回FALSE。移动文件移动文件此函数用于复制一个文件到指定的目录及文件名中。此函数用于复制一个文件到指定的目录及文件名中。BOOLCopyFile(LPCTSTRlpExistingFileName,LPCTSTRlpNewFileName,BOOLbFailIfExists);lpExistingFileName:是已存在的文件名及其路径。:是已存在的文件名及其路径。lpNewFileName:是要复制的文件名及其路径。:是要复制的文件名及其路径。bFailIfExists:指定如果存在与参数:指定如果存在与参数lpNewFileName同名的文件,同名的文件,该采取的操作。若设置为该采取的操作。若设置为TRUE,函数调用失败;若设置为,函数调用失败;若设置为FALSE,函数调用成功,覆盖现有文件。,函数调用成功,覆盖现有文件。如果函数调用成功则返回如果函数调用成功则返回TRUE,否则返回,否则返回FALSE。复制文件复制文件此函数用于查找给定路径或默认路径指定的文件。此函数用于查找给定路径或默认路径指定的文件。DWORDSearchPath(LPCTSTRlpPath,/指定查找文件的路径指定查找文件的路径LPCTSTRlpFileName,/需查找文件的名称需查找文件的名称LPCTSTRlpExtension,/文件的扩展名文件的扩展名DWORDnBufferLength,/接受合法路径和文件名的缓冲区的长度接受合法路径和文件名的缓冲区的长度LPTSTRlpBuffer,/缓冲区指针,包含已找到文件的有效路径和文件名缓冲区指针,包含已找到文件的有效路径和文件名LPTSTR*lpFilePart);/包含路径中最后一个反斜杠包含路径中最后一个反斜杠“”之后的字符地之后的字符地址址查找文件查找文件返回值返回值如果函数调用成功则返回路径的字符长度。如果返回值大于如果函数调用成功则返回路径的字符长度。如果返回值大于nBufferLength,则表明容纳路径实际需要的字符长度。如果函数调用不成功则返回零。则表明容纳路径实际需要的字符长度。如果函数调用不成功则返回零。使用函数使用函数FindFirstFile查找与指定查找文件名匹配的第一个文件的目录。此函查找与指定查找文件名匹配的第一个文件的目录。此函数除了检查指定路径的主文件夹之外,还检查子目录名称和文件夹。应用程序数除了检查指定路径的主文件夹之外,还检查子目录名称和文件夹。应用程序可以重复调用可以重复调用FindNextFile函数,检索匹配查找文件名的所有文件和目录。函数,检索匹配查找文件名的所有文件和目录。FindFirstFile函数函数此函数用于检查指定路径的主文件夹及其子目录和子文件夹。此函数用于检查指定路径的主文件夹及其子目录和子文件夹。HANDLEFindFirstFile(LPCTSTRlpFileName,LPWIN32_FIND_DATAlpFindFileDataLPHANDLElpFileAttribute);lpFileName:是合法的目录或包含路径的文件名,可以包含通配符:是合法的目录或包含路径的文件名,可以包含通配符“*”和和“?”,但不能,但不能超过超过MAX_PATH(在(在“stdlib.h”中定义的最大路径长)的长度。中定义的最大路径长)的长度。lpFindFileData:是输出参数,为一个指向:是输出参数,为一个指向WIN32_FIND_DATA结构的指针,由结构的指针,由WIN32_FIND_DATA结构中的属性来表示其内容。结构中的属性来表示其内容。lpFileAttribute:文件属性,与前类似。:文件属性,与前类似。返回值返回值如果函数调用成功则返回可供函数如果函数调用成功则返回可供函数FindNextFile和函数和函数FindClose使用的查找句柄,否则返使用的查找句柄,否则返回回INVALID_HANDLE_VALUE。函数函数FindFirstFile和函数和函数FindNextFile两者组合使用,才能两者组合使用,才能将所要找的文件或目录全部列出来。函数将所要找的文件或目录全部列出来。函数FindNextFile的原的原型如下:型如下:BOOLFindNextFile(HANDLEhFindFile,LPWIN32_FIND_DATAlpFindFileData);其中,第一个参数是由调用函数其中,第一个参数是由调用函数FindFirstFile返回的查找句返回的查找句柄,第二个参数是输出参数。柄,第二个参数是输出参数。获取文件信息获取文件信息DWORD GetFileType(HANDLE hFile)返回值:返回值:FILE_TYPE_CHAR字符文件,通常为字符文件,通常为LPT设备或控制台设备或控制台FILE_TYPE_DISK磁盘文件磁盘文件FILE_TYPE_PIPE套接字,一个命名的或未命名的管道套接字,一个命名的或未命名的管道FILE_TYPE_UNKNOW不能识别指定文件,或函数调用失败不能识别指定文件,或函数调用失败获取文件大小获取文件大小DWORD GetFileSize(HANDLE hFile,/文件句柄文件句柄LPDWORD lpFileSizeHigh);/用于返回文件长度用于返回文件长度的高字。可以指定为的高字。可以指定为NULL,这时返回文件大小的低双字,这时返回文件大小的低双字获取和设置文件属性获取和设置文件属性DWORD GetFileAttributes(LPCTSTR lpFileName);/lpFileName指定了文件或目录的名称指定了文件或目录的名称DWORD SetFileAttributes(LPCTSTR lpFileName,/目标文件名称目标文件名称DWORD dwFileAttributes/要设置的属性值要设置的属性值);6.2 驱动器和目录驱动器和目录BOOL SetVolumeLabel(LPCTSTR lpRootPathName,/目标驱动器根目录名称目标驱动器根目录名称DWORD lpVolumeName/要设置的卷标名称。如果为要设置的卷标名称。如果为NULL,则删除卷标,则删除卷标);卷标操作卷标操作BOOL GetVolumeInformation(LPCTSTRlpRootPathName,/目标驱动器根目录名称目标驱动器根目录名称LPCTSTRlpVolumeNameBuffer,/驱动器卷标的缓冲区驱动器卷标的缓冲区DWORDnVolumeNameSize,/缓冲区长度缓冲区长度LPDWORDlpVolumeSerialNumber,/驱动器序列号驱动器序列号LPDWORDlpMaximumComponentLength,/文件名最大长度文件名最大长度LPDWORDlpFileSystemFlags,/驱动器属性信息驱动器属性信息LPSTRlpFileSystemNameBuffer,/返回文件系统名称,返回文件系统名称,FAT等等DWORDnFileSystemNameSize/指定文件系统名称长度指定文件系统名称长度);UINTGetDriveType(LPCTSTRlpRootPathName);获取驱动器类型列表获取驱动器类型列表此函数返回无符号整数,表示驱动器的类型,它可以是表中的返回值之一。此函数返回无符号整数,表示驱动器的类型,它可以是表中的返回值之一。返返 回回 值值含含 义义DRIVE_UNKNOWN(=0)驱动器类型不明驱动器类型不明DRIVE_NO_ROOT_DIR(=1)非法路径,该驱动器很可能不存在非法路径,该驱动器很可能不存在DRIVE_REMOVABLE(=2)可移动磁盘,盘片可以从驱动器中移出,如软驱可移动磁盘,盘片可以从驱动器中移出,如软驱DRIVE_FIXED(=3)固定磁盘,盘片不可以从驱动器中移出固定磁盘,盘片不可以从驱动器中移出DRIVE_REMOTE(=4)远端(网络)驱动器远端(网络)驱动器DRIVE_CDROM(=5)CD-ROM驱动器驱动器DRIVE_RAMDISKRAM Disk获取磁盘剩余空间函数获取磁盘剩余空间函数GetDiskFreeSpace该函数用于获得指定磁盘剩余的空间。该函数用于获得指定磁盘剩余的空间。BOOLGetDiskFreeSpace(LPCTSTRlpRootPathName,/驱动器根目录名称驱动器根目录名称LPDWORDlpSectorsPerCluster,/每簇的扇区数每簇的扇区数LPDWORDlpBytesPerSector,/每个扇区的字节每个扇区的字节LPDWORDlpNumberOfFreeClusters,/空余的簇数空余的簇数LPDWORDlpTotalNumberOfClusters);/总共的簇数总共的簇数格式化驱动器函数格式化驱动器函数SHFormatDrive该函数用于格式化逻辑驱动器。该函数用于格式化逻辑驱动器。DWORDSHFormatDrive(HWNDhwnd,/为格式化对话框指定父窗口句柄为格式化对话框指定父窗口句柄UINTdrive,/驱动器,驱动器,0代表代表A盘,盘,1-B,依次,依次UINTfmtID,/物理格式标识,物理格式标识,SHFMT_ID_DEFAULTUINToptions);/改变对话框的默认选项,改变对话框的默认选项,0表示默认,表示默认,/SHFMT_OPT_FULL表示表示“快速格式化快速格式化”,SHFMT_OPT_SYSONLY/表示选中表示选中“创建一个创建一个MS-DOS启动盘启动盘”创建目录函数创建目录函数CreateDirectory用此函数在程序中创建一个指定路径的目录。用此函数在程序中创建一个指定路径的目录。BOOLCreateDirectory(LPCTSTRlpPathName,/文件及其路径字符串文件及其路径字符串LPSECURITY_ATTRIBUTESlpSecurityAttributes);/目录的安全性目录的安全性目录操作目录操作BOOLRemoveDirectory(LPCTSTRlpPathName/同上同上);删除目录函数删除目录函数6.3注册表操作注册表操作注册表注册表-操作系统和用户应用程序的设置仓库。操作系统和用户应用程序的设置仓库。注册表可以是存储在磁盘上的静态数据,也可能是一系注册表可以是存储在磁盘上的静态数据,也可能是一系列由列由Windows内核负责维护的内存中的数据。内核负责维护的内存中的数据。注册表的结构注册表的结构注册表是一个数据库,它的结注册表是一个数据库,它的结构同逻辑磁盘类似。构同逻辑磁盘类似。键:磁盘目录键:磁盘目录键值:磁盘文件键值:磁盘文件一个键可以有多个子键和键值。一个键可以有多个子键和键值。键值用来存储数据。键值用来存储数据。注册表的五个根键注册表的五个根键HKEY_CLASSES_ROOT/可识别扩展名可识别扩展名HKEY_CURRENT_USER/当前用户配置当前用户配置HKEY_LOCAL_MACHINE/本地机器所有软硬件信息本地机器所有软硬件信息HKEY_USERS/所有用户的配置信息所有用户的配置信息HKEY_CURRENT_CONFIG/当前配置文件当前配置文件.注册表键值存储数据类型注册表键值存储数据类型REG_DWORD双字节变量,可存数字和布尔型变量双字节变量,可存数字和布尔型变量REG_BINARY二进制数据。可存长度超过二进制数据。可存长度超过32位的数字位的数字和原始数据,如加密密码。和原始数据,如加密密码。REG_SZ字符串变量字符串变量管理注册表管理注册表创建子键创建子键LONGRegCreatKeyEx(HKEYhkey,/主键句柄主键句柄;LPCTSTRlpSubkey,/子键名称子键名称;DWORDReserved,/给给0LPCTSTRlpclass,/定义一个类名,一般为定义一个类名,一般为0;DWORDdwoptions,/打开方式打开方式,操作方式操作方式.REG_OPTION_LONG_VOLATILE永久生效去永久生效去掉掉_LONG是临时生效是临时生效.REGSAMsumdesived/对注册表键值的访问权限对注册表键值的访问权限.KEY_ALL_ACCESS全部权限全部权限LPSECURITY_ATTRIBUTESlpsecurityattbutes/NULLPHKEYphkresult,/保留当前打开键的作用保留当前打开键的作用.键的句柄指针键的句柄指针.LPDWORDlpdwdisposition/本次操作的数据存储到该参数里本次操作的数据存储到该参数里);关闭子键:关闭子键:LONGRegCloseKey(HKEYhkey);打开子键打开子键LONGRegOpenKeyEx(HKEYhKey,/已经打开键的句柄已经打开键的句柄LPCTSTRlpSubKey,/子键的名称子键的名称DWORDulOptions,/保留保留REGSAMsamDesired,/安全访问标记安全访问标记PHKEYphkResult/指向将要打开键的句柄指向将要打开键的句柄);LONGRegCreatKeyEx函数函数删除子键删除子键LONGRegDeleteKey(HKEYhkey,/主键句柄主键句柄;LPCTSTRlpSubkey,/子键名称子键名称;);键值操作键值操作LONGRegSetValueEx(HKEYhKey,/键值所在子键句柄键值所在子键句柄LPCTSTRlpValueName,/要设置的键值名称要设置的键值名称DWORDReserved,/保留,必须为保留,必须为0DWORDdwType,/要设键值数据类型要设键值数据类型CONSTBYTE*lpData,/指向包含键值数据的缓冲区指向包含键值数据的缓冲区DWORDcbData/缓冲区的长度缓冲区的长度);读取键值数据类型和数据内容读取键值数据类型和数据内容LONGRegQueryValueEx(HKEYhKey,/子键句柄子键句柄LPCTSTRlpValueName,/键值名称键值名称LPDWORDReserved,/保留,必须为保留,必须为0LPDWORDLpType,/返回键值类型返回键值类型,LPBYTElpData,/返回键值的数据内容返回键值的数据内容LPDWRDlpcbData/缓冲区长度缓冲区长度);删除键值删除键值LONGRegDeleteValue(HKEYhkey,/键值所在子键句柄键值所在子键句柄;LPCTSTRlpValueName,/要删除键值名称要删除键值名称;);ATL库(库(CRegKey类)类)操作注册表类:操作注册表类:CRegKey类,在类,在atlbase.h中中打开存在的键值:打开存在的键值:LONGOpen(HKEYhKeyParent,LPCTSTRlpszKeyName,REGSAMsamDesired=KEY_READ|KEY_WRITE);创建或打开存在的键值:创建或打开存在的键值:LONGCreate(HKEYhKeyParent,LPCTSTRlpszKeyName,LPTSTRlpszClass,DWORDdwOptions,REGSAMsamDesired=KEY_READ|KEY_WRITE,LPSECURITY_ATTRIBUTESlpSecAttr,LPDWORDlpdwDisposition)ATL库(库(CRegKey类)类)获取指定键值的数据:获取指定键值的数据:LONGQueryValue(DWORD&dwValue,LPCTSTRlpszValueName);设置、创建、删除键值数据:设置、创建、删除键值数据:LONGSetValue(DWORDdwValue,LPCTSTRlpszValueName);LONGDeleteValue(LPCTSTRlpszValue);将注册表数据立即写入磁盘:将注册表数据立即写入磁盘:LONGFlush();内存映射文件和虚拟内存相似,保留一个地址空间区域,内存映射文件和虚拟内存相似,保留一个地址空间区域,在需要时将它提交到物理存储器。在需要时将它提交到物理存储器。内存映射文件:提交到物理存储器上的数据来自磁盘文件,内存映射文件:提交到物理存储器上的数据来自磁盘文件,而不是系统页文件。一旦文件被映射,就认为整个文件被而不是系统页文件。一旦文件被映射,就认为整个文件被加载到了内存中,可以象访问内存一样访问文件内容。加载到了内存中,可以象访问内存一样访问文件内容。6.4 内存映射文件内存映射文件1.直接用内存映射文件来访问磁盘上的数据文件直接用内存映射文件来访问磁盘上的数据文件,无需再进无需再进行文件的行文件的I/0操作操作.2.用来在多个进程之间共享数据用来在多个进程之间共享数据.进程间共享数据有很多种进程间共享数据有很多种方法方法,比如发送消息比如发送消息WM_COPYDATA,匿名管道等等匿名管道等等,但他但他们的低层都毫无例外的使用到了们的低层都毫无例外的使用到了MappingFile.然而因为然而因为WM_COPYDATA一定需要使用同步函数一定需要使用同步函数SendMessage,所所以在实时性方面表现的不是很好以在实时性方面表现的不是很好.3.系统使用内存映射文件来加载和执行系统使用内存映射文件来加载和执行.EXE和和.DLL文件。文件。节省系统页文件和缩短启动应用程序时间。节省系统页文件和缩短启动应用程序时间。6.4 内存映射文件内存映射文件内存映射过程内存映射过程内存映射文件的位置在内存映射文件的位置在3G4G的空间中的空间中,这部分是这部分是Win32所所有进程都看的到并且共享的有进程都看的到并且共享的,自然可以用来传输数据自然可以用来传输数据,另外各另外各个进程所共享的个进程所共享的DLL等也是映射在这个空间范围等也是映射在这个空间范围.内存映射文件的使用可以分为以下三步内存映射文件的使用可以分为以下三步:1.CreateFileMapping创建一个文件映射内核对象创建一个文件映射内核对象2.MapViewOfFile将文件数据映射进进程地址空间将文件数据映射进进程地址空间3.UnmapViewOfFile从进程地址空间解除这个映射从进程地址空间解除这个映射进程间共享内存进程间共享内存内存映射文件的另一个功能进程间共享数据,让不同进程内存映射文件的另一个功能进程间共享数据,让不同进程可以共享内存。可以共享内存。调用调用CreateFileMapping创建命名的内存映射对象时,创建命名的内存映射对象时,Windows即在物理内存申请一块指定大小的内存区域,返即在物理内存申请一块指定大小的内存区域,返回文件映射对象的句柄回文件映射对象的句柄hMap。为了访问这个内存区域必须。为了访问这个内存区域必须调用调用MapViewOfFile函数,促使函数,促使Windows将此内存空间映将此内存空间映射到进程的地址空间中。当在其他进程访问这块内存区域射到进程的地址空间中。当在其他进程访问这块内存区域时,则必须使用时,则必须使用OpenFileMapping函数取得对象句柄函数取得对象句柄hMap,并调用,并调用MapViewOfFile函数得到此内存空间的一个函数得到此内存空间的一个映射。这样系统就把同一块内存区域映射到不同进程的地映射。这样系统就把同一块内存区域映射到不同进程的地址空间中,从而达到共享内存的目的。址空间中,从而达到共享内存的目的。6.5 文件切割系统文件切割系统编程思路编程思路结结 束束