现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

CreateFile 获取一个文件或程序的内核句柄

2012-08-11 22:49 工业·编程 ⁄ 共 2718字 ⁄ 字号 暂无评论

该函数用来打开或创建一个文件并且获取该文件的内核句柄。

函数原型:

HANDLE CreateFile(

LPCTSTR lpFileName, //指向文件名的指针

DWORD dwDesiredAccess, //访问模式(写/读)

DWORD dwShareMode, //共享模式

LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针

DWORD dwCreationDisposition, //如何创建

DWORD dwFlagsAndAttributes, //文件属性

HANDLE hTemplateFile //用于复制文件句柄

);

参数列表:

1、lpFileName
一个指向无终结符的字符串的指针,来指明要创建或打开的对象的名字。
2、dwDesiredAccess
指明对象的控制模式。一个应用程序可以包含读控制、写控制、读/写控制、设备查询控制。
这个参数的取值可以是下面这些的组合:
    0                                   指定设备查询控制:程序可以不访问设备就查询到设备属性。
    GENERIC_READ               指定读控制,可以从对象中读取数据(指针将可以移动)。
    GENERIC_WRITE             指定写控制,可以向对象中写数据(指针将可以移动)。

3、dwShareMode
指定对象的共享模式。如果dwShareMode==0,表示是互斥使用的。如果CreateFile打开成功,则别的程序只能等到当前程序关闭对象句柄CloseHandle后才能在打开或使用。
使用下面这些值的组合来表示对象的共享模式:
    FILE_SHARE_DELETE       Windows NT/2000/XP:打开操作只有在删除请求发生时才能返回成功。
    FILE_SHARE_READ                 打开操作只有在读控制请求发生时才能返回成功。
    FILE_SHARE_WRITE                打开操作只有在写控制请求发生时才能返回成功。

4、lpSecurityAttributes (这个参数一般可以设置为 NULL)
一个指向SECURITY_ATTRIBUTES结构对象的指针,决定返回的句柄是否被子进程所继承。如果lpSecurityAttributes参数为NULL,句柄就不能被子进程继承。
在Windows NT/2000/XP平台下:lpSecurityDescriptor这个成员指明了这个对象的安全描述符。如果lpSecurityAttributes参数为NULL,对象将获得一个默认的安全描述符。目标文件系统必须为这个参数的在文件上的有效操作保证安全性。
typedef struct _SECURITY_ATTRIBUTES { 
DWORD nLength; //结构体的大小(字节为单位),即siziof(SECURITY_ATTRIBUTES)
LPVOID lpSecurityDescriptor; //指向对象的安全描述符的指针,控制对象的共享属性。在Windows 95/98/Me平台                                                     //上这个成员被忽略。
BOOL   bInheritHandle; //指明当一个新的子进程创建时,是否继承当前返回的句柄
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;

5、dwCreationDisposition
指明当打开的对象存在或不存在的时候各需怎样处理。这个参数必须是一下值的其中之一:
    CREATE_NEW            创建新文件/对象(当对象已经存在是将返回失败)。
    CREATE_ALWAYS         总是创建(如果对象存在就覆盖它,清除当前属性,把文件属性和dwFlagsAndAttributes指定的标志相结合)。
    OPEN_EXISTING         打开文件(如果不存在就返回失败)。
    OPEN_ALWAYS      存在就打开;若不存在,假如dwCreationDisposition==CREATE_NEW就创建一个新文件。
    TRUNCATE_EXISTING     存在就打开,且清空文件内容(至少要有GENERIC_WRITE权限);若文件不存在就返回失败。

6、dwFlagsAndAttributes Long,

指定文件属性和标志。可以是以下值的任意组合(只有FILE_ATTRIBUTE_NORMAL必须单独使用,唯一例外):

FILE_ATTRIBUTE_ARCHIVE 标记归档属性

FILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式

FILE_ATTRIBUTE_NORMAL 默认属性 文件没有其他属性设置,此属性只能单独使用才合法。

FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录

FILE_ATTRIBUTE_READONLY 文件为只读

FILE_ATTRIBUTE_SYSTEM 文件为系统文件

FILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作

FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作

FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块

FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化

FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化

FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件

7、hTemplateFile (这个参数一般可以默认为 NULL)
把具有GENERIC_READ权限的句柄指定为一个模板文件。这个模板文件提供了文件属性和扩展属性,用于创建文件。在Windows95/98/Me平台上:这个参数必须为空,否则如果你提供一个句柄,函数调用将会失败,用GerLastError函数获得的出错信息为ERROR_NOT_SUPPORTED。

返回值:

如函数执行成功,则返回文件(程序)的句柄。否则返回: INVALID_HANDLE_VALUE

误区

CreateFile的涵义是创建File这个内核对象,而不是创建物理磁盘上的文件。在Win32 API中有一系列操作内核对象的函数,创建内核对象的函数大多命名为CreateXxxx型。

给我留言

留言无头像?