作者:小 琛
CreateFileW和CreateFileA
Windows下函数,大多都有两种实现,Windows本身通过UNICODE(是否位UNICODE)宏来区分使用哪一个API
#ifdef UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile CreateFileA
#endif // !UNICODE
作用(使用场景)
创建或打开文件或 I/O 设备。最常用的 I/O 设备如下:文件、文件流、目录、物理磁盘、控制台缓冲区、磁带驱动器、通信资源、邮槽和管道。该函数返回一个句柄,根据文件或设备以及指定的标志和属性,该句柄可用于访问文件或设备以进行各种类型的 I/O。
个人使用心得:更多的时候,我们用它来打开一个已存在的设备
参数解析
HANDLE CreateFileW(
[in] LPCSTR lpFileName,
[in] DWORD dwDesiredAccess,
[in] DWORD dwShareMode,
[in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
[in] DWORD dwCreationDisposition,
[in] DWORD dwFlagsAndAttributes,
[in, optional] HANDLE hTemplateFile
);
- [in] lpFileName
要打开或添加的设备名称,此函数的 ANSI 版本(CreateFileA)中,名称仅限于MAX_PATH字符。要将此限制扩展到 32,767 个宽字符,请使用此 Unicode 版本的函数并在路径前添加“\?\”。 - [in] dwDesiredAccess
对文件或设备的请求权限,例如:读、写、读||写(GENERIC_READ、 GENERIC_WRITE、GENERIC_READ | GENERIC_WRITE)。 - [in] dwShareMode
文件或设备请求的共享模式,可以是read、write、both、delete、all these或none(参考下表)。
值 | 含义 |
---|---|
0 | 如果文件或设备请求删除、读取或写入访问权限,则阻止对文件或设备的后续打开操作。 |
FILE_SHARE_DELETE | 启用对文件或设备的后续打开操作以请求删除访问权限。 |
FILE_SHARE_READ | 启用对文件或设备的后续打开操作以请求读取访问权限。 |
FILE_SHARE_WRITE | 启用对文件或设备的后续打开操作以请求写入访问权限。 |
注意,dwDesiredAccess和dwShareMode可能出现冲突,例如第一个程序将某设备dwShareMode设定了FILE_SHARE_READ,后续请求该设备的仅仅可以有GENERIC_READ权限,而不能有GENERIC_WRITE。
- [in, optional] lpSecurityAttributes
一个指向SECURITY_ATTRIBUTES 结构的指针,该结构包含两个独立但相关的数据成员:一个可选的安全描述符和一个布尔值,用于确定返回的句柄是否可以被子进程继承。
此参数可以为NULL,且通常设置为NULL。
如果此参数为NULL ,则CreateFile返回的句柄 不能被应用程序可能创建的任何子进程继承,并且与返回的句柄关联的文件或设备将获得默认的安全描述符。
结构的lpSecurityDescriptor成员为文件或设备指定 SECURITY_DESCRIPTOR。如果此成员为NULL,则为与返回句柄关联的文件或设备分配一个默认安全描述符。
CreateFile在打开现有文件或设备时忽略 lpSecurityDescriptor成员,但继续使用bInheritHandle成员。
结构的bInheritHandle成员指定返回的句柄是否可以被继承。
- [in] dwCreationDisposition
对存在或不存在的文件或设备执行的操作。
对于文件以外的设备,此参数通常设置为OPEN_EXISTING
值 | 含义 |
---|---|
CREATE_ALWAYS | 总是创建一个新文件。 |
CREATE_NEW | 仅当不存在时创建 |
FILE_SHARE_READ | 启用对文件或设备的后续打开操作以请求读取访问权限。 |
OPEN_EXISTING | 打开一个已经存在的设备 |
注意:通常使用的是OPEN_EXISTING,如果指定的文件或设备不存在,则函数失败并且最后一个错误代码设置为 ERROR_FILE_NOT_FOUND (2)。
博主在开发的时候,遇到一种情况,使用它打开service,出现了433的错误码,这个问题是Windows关于service的错误,具体解决看这篇博文 关于Windows service
-
[in] dwFlagsAndAttributes
文件或设备属性和标志,FILE_ATTRIBUTE_NORMAL是文件最常见的默认值。 -
[in, optional] hTemplateFile
具有GENERIC_READ访问权限的模板文件的有效句柄。模板文件为正在创建的文件提供文件属性和扩展属性。
此参数可以为NULL。打开现有文件时,CreateFile 会忽略此参数。
返回值
如果函数成功,则返回值是指定文件、设备、命名管道或邮槽的打开句柄。
如果函数失败,则返回值为INVALID_HANDLE_VALUE。要获取扩展的错误信息,请调用GetLastError。