Windows学习(003)--CreateFile

CreateFile

原型:

HANDLE  CreateFile(
    _In_ LPCTSTR lpFileName,
    _In_ DWORD dwDesiredAccess,
    _In_ DWORD dwShareMode,
    _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    _In_ DWORD dwCreationDisposition,
    _In_ DWORD dwFlagsAndAttributes,
    _In_opt_ HANDLE hTemplateFile
    );

CreateFile的参数
更具体参考MSDN

lpFileName

指定要打开、创建的文件或设备的名字。

dwDesiredAccess

  1. 指定以何种权限打开文件或设备,可以归纳为:读访问权、写访问权、读写访问权、非读非写访问权。
  2. 最常使用的值为 GENERIC_READ, GENERIC_WRITE, 或者二者都用(GENERIC_READ | GENERIC_WRITE)。获取更多信息,参见 Generic Access Rights, File Security and
    Access Rights, File Access Rights Constants 和 ACCESS_MASK
  3. 如果参数值为 0,那么程序可以在不访问文件或设备情况下,询问某些元数据,如文件、目录或者设备属性。此外,即使 GENERIC_READ 请求,也会被拒绝。
  4. 你无法请求一个与共享模式冲突的访问权限。共享模式是在参数 dwShareMode 中设置的。

dwShareMode

  1. 设置文件或者设备的共享模式,包括读、写、读写、删除、全部权限或者以上什么权限都没有(参考下面的表格)。此参数不影响对属性和扩展属性的访问请求。
  2. 如果此参数为 0 且 CreateFile 函数执行成功,那么此文件或设备无法被共享,且在其句柄被关闭前,无法被再次打开。更多信息,参见本文备注。
  3. 你无法设置一个与访问模式相冲突的共享模式。此时如果 CreateFile 函数执行失败,那么 GetLastError 函数会返回 ERROR_SHARING_VIOLATION。
  4. 为了允许进程去共享一个已经在另一个进程中打开的文件或句柄,那么可对以下一个或多个取值进行组合,且各取值间需要可互相兼容。更多有关此参数与
    dwDesiredAccess 参数的合法取值组合的信息,参见 Creating and Opening Files。
  5. 注意:在句柄被关闭之前,每个句柄的共享选项都会一直生效,且与进程的运行上下文(process context)无关。

lpSecurityAttributes

  1. 指向 SECURITY_ATTRIBUTES 结构体的指针。此结构体拥有两个分开但是相关的数据成员:一个是可选的安全描述符,另一个是决定返回的句柄是否可以被子进程继承的 Boolean 值。
  2. 此参数可以设置为 NULL。
  3. 如果参数为 NULL,那么 CreateFile 函数返回的句柄无法被任意此进程的子进程所继承,且与返回的句柄所对应的文件或句柄拥有一个默认的安全描述符
  4. 该结构体的 lpSecurityDescriptor 成员为文件或设备指定一个安全描述符(SECURITY_DESCRIPTOR)。如果此成员取值为 NULL,那么与返回的句柄所对应的文件或句柄拥有一个默认的安全描述符
  5. 当打开一个已经存在的文件或设备时,CreateFile 函数忽略 lpSecurityDescriptor 成员,但是 bInheritHandle 成员仍然可以使用
  6. 结构体的 bInheritHandle 成员用于设置返回的句柄是否可以被继承

dwCreationDisposition

  1. 用于设置当文件存在或不存在时,要对文件或设备执行何种操作
  2. 对于设备来说,此参数通常设置为 OPEN_EXISTING

dwFlagsAndAttributes

  1. 文件或设备的属性值和标记位,对于文件来说,FILE_ATTRIBUTE_NORMAL 是最常用的默认值
  2. 此参数可以是任意文件属性值(FILE_ATTRIBUTE_*)的组合。所有其他的文件属性值会覆盖 FILE_ATTRIBUTE_NORMAL
  3. 此参数也可以包含任意标记位(FILE_FLAG_*)的组合以控制文件或设备的行为、权限设置和其他目的。此外,还可以与任意 FILE_ATTRIBUTE_* 进行组合
  4. 这个参数还可以通过指定 SECURITY_SQOS_PRESENT 标记来包含 Security Quality of Service (SQOS) 信息。与SQOS相关的标记位信息见属性与标记位表格下面的表格中
  5. 注意:当CreateFile 打开一个已存在的文件时,它通常将文件属性和文件标记位组合在一起,并且忽略在 dwFlagsAndAttributes 中定义的属性值。详细例子见 Creating and Opening Files
  6. 以下的属性和标记位可能只适用于文件的打开,而并非支持所有其他 CreateFile 函数可以打开的设备。想了解更多信息,参见本文备注部分和 Creating and Opening Files。想进一步了解文件属性相关信息,参见 SetFileAttributes 函数。你还可以在 File Attribute Constants 中看到完整的介绍所有文件属性的值和对应描述信息

hTemplateFile

  1. 指向一个拥有 GENERIC_READ 访问权限的的模板文件的合法句柄
  2. 此模板文件为即将创建的文件提供属性和扩展属性
  3. 参数值可以为 NULL
  4. 如果打开一个已存在的文件,则 CreateFile 函数忽略这个参数
  5. 如果打开一个新的被加密文件,此函数从其父目录中继承自由存取控制列表。更多信息,见 File Encryption

返回值

  1. 如果函数调用成功,返回指向指定文件的句柄、设备、命名管道或者邮槽;
  2. 如果函数调用失败,返回值为 INVALID_HANDLE_VALUE。
  3. 想获取具体错误信息,调用 GetLastError 函数。
### 回答1: Windows API 是一组用于开发 Windows 应用程序的函数、接口和编程实例。精通 Windows API 对于 Windows 应用程序开发者来说非常重要。 首先,函数是 Windows API 提供的可用于实现特定功能的代码块。Windows API 中有各种各样的函数,包括用于创建窗口、绘制图形、处理输入等功能的函数。精通这些函数意味着你能够熟练地使用它们,了解它们的参数和返回值,并在实际应用中有效地调用它们。 接口是 Windows API 提供的一种交互方式,用于与操作系统、硬件设备和其他应用程序进行通信。通过使用接口,开发者可以利用 Windows API 提供的功能和资源。精通 Windows API 接口意味着你能够理解接口的工作原理,编写代码与其他应用程序进行交互,并通过接口实现自己的扩展和功能。 编程实例是使用 Windows API 进行开发的实际案例。这些案例可以帮助开发者理解如何使用 Windows API 的函数和接口来完成特定的任务。在这些实例中,开发者可以学习如何创建窗口、处理消息、显示图形等常见的 Windows 应用程序开发任务。通过研究这些实例,你可以学会如何有效地使用 Windows API 来开发自己的应用程序。 总而言之,精通 Windows API-函数、接口和编程实例,意味着你能够熟练地使用 Windows API 提供的功能,理解接口的工作原理,并能够仿照编程实例编写自己的 Windows 应用程序。这对于任何希望在 Windows 平台上进行应用程序开发的开发者来说都是非常重要的技能。 ### 回答2: 精通 Windows API-函数、接口、编程实例的 PDF 可以帮助开发人员更好地理解和应用 Windows API。下面是一些关于此主题的要点: 1. Windows API是一组功能强大的函数和接口,可让开发人员与 Windows 操作系统进行交互。通过使用 Windows API,开发人员可以访问和控制 Windows 操作系统的各种功能,例如文件操作、网络通信、图形界面等。 2. 函数和接口是 Windows API 的核心组成部分。函数是预先编写好的代码块,可以实现特定的功能。接口是一组以特定方式交互的函数的集合,提供了一种与外部程序或设备进行通信的方式。 3. 精通 Windows API 需要熟悉常用的函数和接口。一些常见的函数包括 CreateFile、ReadFile、WriteFile(用于文件操作)、MessageBox(用于消息框显示)等。常见的接口包括 Winsock(用于网络编程)、GDI(用于图形界面编程)等。 4. 编程实例是通过实际的代码示例来演示如何使用 Windows API 进行编程。编程实例可以帮助开发人员更好地理解函数和接口的使用方法,并学会如何将其应用到实际项目中。 5. 学习和理解 Windows API 需要进行实践。除了阅读相关的文档和书籍外,还可以通过编写小型的示例程序来练习和熟悉 Windows API 的使用。 总之,精通 Windows API-函数、接口、编程实例的 PDF 是一个有助于开发人员学习和应用 Windows API 的资源。通过深入学习函数和接口的使用方法,并通过编程实例进行实践,开发人员可以更好地掌握 Windows API 的知识和技能,从而在 Windows 平台上开发出高质量的应用程序。 ### 回答3: 精通Windows API函数、接口和编程实例对于开发Windows应用程序以及进行系统级编程非常重要。Windows API提供了各种函数和接口,使开发者能够直接与Windows操作系统进行交互,并实现更高级的功能。 首先,了解Windows API函数是至关重要的。这些函数可以用于控制窗口、处理消息、操作文件、管理内存等各种任务。例如,CreateWindow函数可以创建一个窗口,SendMessage函数可以发送消息给其他窗口,ReadFile函数可以读取文件内容等。掌握这些函数,可以更好地控制和管理应用程序的行为。 其次,熟悉Windows API接口也是必要的。接口是指一组函数和结构体的集合,用于实现特定功能。例如,Win32 API提供了许多接口,如GDI(图形设备接口)、COM(组件对象模型)等。通过调用这些接口,可以实现图形绘制、多媒体处理、网络通信等功能。 最后,编程实例对于学习和应用Windows API也至关重要。通过实践编写一些常见的应用程序,如文本编辑器、游戏、图形界面等,可以更好地理解API的使用方法和原理。编程实例可以帮助开发者熟悉常见的函数调用序列、参数传递方式、异常处理等技巧,提高编码效率和代码质量。 总之,精通Windows API函数、接口和编程实例对于开发Windows应用程序非常重要。通过学习和实践,可以更好地掌握API的使用方法和原理,提高开发效率和程序质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值