CreateFile无法共享串行(COM)端口

时间:2018-05-07 13:51:44

标签: c++ winapi serial-port createfile

same issue函数可用于打开文件或设备以进行读/写访问,从而提供句柄。

第三个参数 dwShareMode 指定以后是否可以访问文件/设备。一个例子,包含文件:

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

一切都很好:我们有两个不同的句柄可以读/写一个文件。

但在我的情况下,我想使用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端口吗?

1 个答案:

答案 0 :(得分:4)

引用CreateFile的文档:

  

CreateFile函数可以创建通信资源的句柄,例如串行端口COM1。对于通信资源,dwCreationDisposition参数必须为OPEN_EXISTINGdwShareMode参数必须为零(独占访问权限),hTemplateFile参数必须为NULL。可以指定读,写或读/写访问权限,并且可以为重叠的I / O打开句柄。

这里的文档暗示通信对象不能像普通文件一样共享。 Windows API将它留给任何打开端口的人来决定他们是如何/如果他们想要共享对该资源的访问权限,并让他们管理该决定的后果。

要共享端口,您可以使用DuplicateHandle并将其传递给您在打开端口后授予其访问权限的任何人。如需进一步阅读,请查看此ancient article from MSDN

也就是说,如果你想在多个进程之间共享一个COM端口,那么最好只在其中一个进程中打开它,并使用某种形式的IPC来传输数据。让一个进程处理端口服务。