CreateFile 无法共享串行 (COM) 端口
CreateFile not able to share serial (COM) port
CreateFile 函数可用于打开文件或设备进行 read/write 访问,提供句柄。
第三个参数,dwShareMode,指定file/device以后是否可以被其他人访问。一个例子,文件:
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 个不同的句柄可以 read/write 一个文件。
但就我而言,我想使用 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 端口吗?
引用 CreateFile
的文档:
The CreateFile
function can create a handle to a communications resource, such as the serial port COM1
. For communications resources, the dwCreationDisposition
parameter must be OPEN_EXISTING
, the dwShareMode
parameter must be zero (exclusive access), and the hTemplateFile
parameter must be NULL
. Read, write, or read/write access can be specified, and the handle can be opened for overlapped I/O.
此处文档的含义是通信对象不能像普通文件一样共享。 Windows API 让打开端口的人决定 how/if 他们想要共享对该资源的访问,并让他们管理该决定的后果。
要共享端口,您可以使用 DuplicateHandle
并在打开端口后将其传递给您想要授予端口访问权限的任何人。如需进一步阅读,请查看此 ancient article from MSDN
就是说,如果您想在多个进程之间共享一个 COM 端口,最好只在其中一个进程中打开它,并使用某种形式的 IPC 来传输数据。让一个进程处理端口服务。
CreateFile 函数可用于打开文件或设备进行 read/write 访问,提供句柄。
第三个参数,dwShareMode,指定file/device以后是否可以被其他人访问。一个例子,文件:
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 个不同的句柄可以 read/write 一个文件。
但就我而言,我想使用 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 端口吗?
引用 CreateFile
的文档:
The
CreateFile
function can create a handle to a communications resource, such as the serial portCOM1
. For communications resources, thedwCreationDisposition
parameter must beOPEN_EXISTING
, thedwShareMode
parameter must be zero (exclusive access), and thehTemplateFile
parameter must beNULL
. Read, write, or read/write access can be specified, and the handle can be opened for overlapped I/O.
此处文档的含义是通信对象不能像普通文件一样共享。 Windows API 让打开端口的人决定 how/if 他们想要共享对该资源的访问,并让他们管理该决定的后果。
要共享端口,您可以使用 DuplicateHandle
并在打开端口后将其传递给您想要授予端口访问权限的任何人。如需进一步阅读,请查看此 ancient article from MSDN
就是说,如果您想在多个进程之间共享一个 COM 端口,最好只在其中一个进程中打开它,并使用某种形式的 IPC 来传输数据。让一个进程处理端口服务。