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端口吗?
答案 0 :(得分:4)
引用CreateFile
的文档:
CreateFile
函数可以创建通信资源的句柄,例如串行端口COM1
。对于通信资源,dwCreationDisposition
参数必须为OPEN_EXISTING
,dwShareMode
参数必须为零(独占访问权限),hTemplateFile
参数必须为NULL
。可以指定读,写或读/写访问权限,并且可以为重叠的I / O打开句柄。
这里的文档暗示通信对象不能像普通文件一样共享。 Windows API将它留给任何打开端口的人来决定他们是如何/如果他们想要共享对该资源的访问权限,并让他们管理该决定的后果。
要共享端口,您可以使用DuplicateHandle
并将其传递给您在打开端口后授予其访问权限的任何人。如需进一步阅读,请查看此ancient article from MSDN
也就是说,如果你想在多个进程之间共享一个COM端口,那么最好只在其中一个进程中打开它,并使用某种形式的IPC来传输数据。让一个进程处理端口服务。