1 参考资料:
msdn:
函数定义
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx
例子:Opening a File for Reading or Writing
https://msdn.microsoft.com/en-us/library/windows/desktop/bb540534(v=vs.85).aspx
例子:串口 Configuring a Communications Resource
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363201(v=vs.85).aspx
例子: 监控串口事件 Monitoring Communications Events
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363424(v=vs.85).aspx
《windows高级编程指南》第15章 设备I/O 重点
2 函数介绍
创建或者打开一个文件或者I/O设备.
通用的I/O设备,包括下面这些:
文件
文件流
目录
物理盘
volume 磁盘卷 逻辑盘
控制台缓冲区
磁带驱动器,
通信资源 串行口 和并行口 应该包括USB 口吧
邮槽和管道
根据所访问对象以及所指定访问特性标识的不同,该函数会返回一个用于访问所指定对象的句柄
3 函数原型
HANDLE WINAPI CreateFile(
_In_ LPCTSTR lpFileName, // 设备名称
_In_ DWORD dwDesiredAccess, // 读还是写
_In_ DWORD dwShareMode, // 对文件的访问独占
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, //可以传NULL
_In_ DWORD dwCreationDisposition, //创建或者打开文件的方式
_In_ DWORD dwFlagsAndAttributes, //
_In_opt_ HANDLE hTemplateFile // 可以为NULL
);
4 参数解析
lpFileName
设备名称 指向文件名的指针
dwDesiredAccess
- 0 不想读写设备数据,只想改变设备的配置—-如文件的时间戳—-应传递0
- GENERIC_READ 只读访问
- GENERIC_WRITE 只写访问 用于向打印机传递数据或者备份软件
- GENERIC_READ | GENERIC_WRITE 允许对设备的读写
dwShareMode
- 0 阻止其他进程打开文件,当该进程想要删除,读或者写访问该文件
- FILE_SHARE_DELETE
- FILE_SHARE_READ
- FILE_SHARE_WRITE
lpSecurityAttributes 指向安全属性的指针
可以为NULL
dwCreationDisposition
当文件 存在 或不存在 ,该函数的默认行为
CREATE_ALWAYS
如果指定的文件存在并且是可写的,函数会覆盖该文件,
函数成功返回,最后的last-error code 设置为ERROR_ALREADY_EXISTS(183)
如果指定的文件不存在,但是是一个有效的路径,会创建新的文件,
函数成功返回,last-error code为 0CREATE_NEW
创建一个新的文件,需要这个文件不存在
如果文件存在,函数失败,返回 ERROR_FILE_EXISTS (80).
如果文件不存在,但是是一个有效的可写的路径位置,会创建一个新的文件- OPEN_ALWAYS
打开一个文件,
如果文件存在,函数正确返回,ERROR_ALREADY_EXISTS (183).
如果不存在,创建一个文件,并且返回0 - OPEN_EXISTING
如果文件存在 就打开
如果文件不存在,函数失败,返回ERROR_FILE_NOT_FOUND(2) - TRUNCATE_EXISTING
打开一个已经存在的文件,并将其大小设置为0
如果文件不存在,则失败,GENERIC_WRITE标志必须同该标志一起使用。
dwFlagsAndAttributes 文件属性和标志
可以为0,一般的普遍的默认值是FILE_ATTRIBUTE_NORMAL ,这个一般是单独使用
有两个作用:它允许微调同设备的通信,如果设备是文件,还能设置文件的属性。
大多数的标志告诉系统你打算如何访问设备。系统可以优化它的缓冲算法来帮助程序工作得更有效
其中的一个标志是 FILE_FLAG_OVERLAPPED ,告诉系统,你想要异步的访问一个设备。
打开设备的缺省方式是同步I/O(不指定FILE_FLAG_OVERLAPPED)。阻塞的写 和读。
因为设备I/O同大多数其他操作相比较缓慢,你可能会想要异步通信某些设备。
简单的说是,你调用一个函数告诉操作系统去读写数据,但是不必要等到I/O结束。
你的调用立即返回。操作系统使用它的线程,为你完成I/O。
当操作系统完成了你请求的I/O的时候,你会得到通知。
异步I/O是设计应该用程序时,一种很方便的方法。
hTemplateFile
标识一个打开的句柄或者为NULL