C++ lagDO_独占设备。通常这是FDO设备,连接到一些PDO。我们可以(而且确实必须)通过PDO接口名称打开它,该名称由CM\u Get\u Device\u interface\u interface\u ListW(&GUID\u deviceinter

C++ lagDO_独占设备。通常这是FDO设备,连接到一些PDO。我们可以(而且确实必须)通过PDO接口名称打开它,该名称由CM\u Get\u Device\u interface\u interface\u ListW(&GUID\u deviceinter,c++,winapi,serial-port,createfile,C++,Winapi,Serial Port,Createfile,lagDO_独占设备。通常这是FDO设备,连接到一些PDO。我们可以(而且确实必须)通过PDO接口名称打开它,该名称由CM\u Get\u Device\u interface\u interface\u ListW(&GUID\u deviceinterface\u COMPORT,…)返回。此PDO不是独占的,但创建串行处理程序通常只允许在设备上打开单个文件对象。因此,您可以有多个句柄,但串行端口只能有一个文件对象。“但为什么多个进程从同一端口读取和写入?”硬件要求。一个COM端口可用于与两


lag
DO_独占设备。通常这是FDO设备,连接到一些PDO。我们可以(而且确实必须)通过PDO接口名称打开它,该名称由
CM\u Get\u Device\u interface\u interface\u ListW(&GUID\u deviceinterface\u COMPORT,…)返回。此PDO不是独占的,但创建串行处理程序通常只允许在设备上打开单个文件对象。因此,您可以有多个句柄,但串行端口只能有一个文件对象。“但为什么多个进程从同一端口读取和写入?”硬件要求。一个COM端口可用于与两个具有不同管脚的设备通信。打开串行端口时,
dwShareMode
与Windows API的NT实现无关。(我不能说死气沉沉的Windows9X实现是如何处理这一问题的。)设备独占性是在I/O读写删除共享之外的另一个层面上。独占设备根本无法再次打开以进行任何访问。在这种情况下,将0用于
dwShareMode
是一种代码中自我记录一致性的形式,但实际上不会改变任何东西。@eryksun-task即使不是在FDO串行设备中也是独占的。它所连接的PDO—不是独占的。我们可以用PDO的名字来开。但是
irp_mj_create
handler for standard serial anyway返回访问被拒绝如果已经在设备上打开了某个文件对象可以确认eryksun所说的:dwShareMode可以设置为0以外的值,但是我认为它被忽略了。@AlexMillette-dwShareMode
仅由您向其发送请求的特定设备进行解释。通常只有文件系统设备使用它。大多数设备(包括串行设备)都会忽略它。@RbMm,通常共享模式与系统定义的
share\u ACCESS
结构和I/O管理器功能一起使用,如
IoCheckShareAccess
。但是命名管道文件系统有一个有趣的管道实例共享模式应用程序。它在Windows API中没有公开,但如果我们调用NTAPI
NtCreateNamedPipeFile
,则使用写共享创建入站管道,使用读共享创建出站管道,使用读写共享创建双工管道——因此可以使用写、读和读写访问打开客户端,分别。打开串行端口时,
dwShareMode
与Windows API的NT实现无关。(我不能说死气沉沉的Windows9X实现是如何处理这一问题的。)设备独占性是在I/O读写删除共享之外的另一个层面上。独占设备根本无法再次打开以进行任何访问。在这种情况下,将0用于
dwShareMode
是一种代码中自我记录一致性的形式,但实际上不会改变任何东西。@eryksun-task即使不是在FDO串行设备中也是独占的。它所连接的PDO—不是独占的。我们可以用PDO的名字来开。但是
irp_mj_create
handler for standard serial anyway返回访问被拒绝如果已经在设备上打开了某个文件对象可以确认eryksun所说的:dwShareMode可以设置为0以外的值,但是我认为它被忽略了。@AlexMillette-dwShareMode
仅由您向其发送请求的特定设备进行解释。通常只有文件系统设备使用它。大多数设备(包括串行设备)都会忽略它。@RbMm,通常共享模式与系统定义的
share\u ACCESS
结构和I/O管理器功能一起使用,如
IoCheckShareAccess
。但是命名管道文件系统有一个有趣的管道实例共享模式应用程序。它没有在Windows API中公开,但是如果我们调用NTAPI
NtCreateNamedPipeFile
,则使用写共享创建入站管道,使用读共享创建出站管道,使用读写共享创建双工管道——因此,可以分别使用写、读和读写访问打开客户端。
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
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!