The 创建文件 https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx函数对于打开文件或设备进行读/写访问非常有用,提供句柄。
第三个参数,dw共享模式,指定文件/设备以后是否可以被其他人访问。一个带有文件的示例:
void* pFileHandle1 = ::CreateFileA("C:\\test.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
DWORD lastError = GetLastError(); // 0, ERROR_SUCCESS
void* pFileHandle2 = ::CreateFileA("C:\\test.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
lastError = GetLastError(); // 0, ERROR_SUCCESS
一切都很好:我们有 2 个不同的句柄可以读取/写入单个文件。
但就我而言,我想使用 COM 端口:
void* pComHandle1 = ::CreateFileA("\\\\.\\COM3", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
lastError = GetLastError(); // 0, ERROR_SUCCESS
void* pComHandle2 = ::CreateFileA("\\\\.\\COM3", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
lastError = GetLastError(); // 5, ERROR_ACCESS_DENIED Oops!
第一个句柄有效并且可以使用,但第二个句柄是 INVALID_HANDLE_VALUE。
那是怎么回事?不能用这种方式共享COM端口吗?