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

2024-01-05

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端口吗?


引用文档CreateFile https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858.aspx:

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

此处文档的含义是通信对象不能像普通文件一样共享。 Windows API 让打开端口的人决定如何/是否要共享对该资源的访问,并让他们管理该决定的后果。

要共享端口,您可以使用DuplicateHandle并在打开端口后将其传递给您想要授予访问该端口的权限的任何人。如需进一步阅读,请查看此来自 MSDN 的古老文章 https://msdn.microsoft.com/en-us/library/ff802693.aspx

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CreateFile 无法共享串行 (COM) 端口 的相关文章

随机推荐

  • 如何创建带有图像和文本的按钮

    Friends 我想在 android 中显示一个按钮 如屏幕截图中提到的 谁能指导我如何实现这一目标 使用普通按钮drawableLeft属性 看我的示例代码
  • EmberJS pre2 将车把模板放在错误的位置

    我尝试在我的网络应用程序上将 EmberJS 从 pre1 更新到 pre2 但我注意到它将所有车把模板作为最后一个主体元素 有时根本不这样做 I ve 创建一个重现 http emberjs pre2 bug staticloud com
  • 有什么办法可以等到 DirectionsService 返回结果吗?

    我在使用 Google DirectionsService 时遇到问题 我知道它是异步的 这就是我遇到麻烦的原因 我想等到 DirectionsService 返回结果 而不是在没有答案的情况下执行代码 这是一个示例 function sn
  • 如何在集成测试中传递授权令牌标头?

    A 相关问题 https stackoverflow com questions 12041091 ror testing an action that uses http token authentication意味着我可以使用令牌身份验
  • Linux进程间通信如何选择“Key”?

    再会 我正在做作业 其中指出我有 5 个进程 一个服务器 其余的都是客户端 每个进程都应该由不同的可执行文件引发 我将实现一个双向消息传递解决方案 但问题不在于消息传递本身 有没有一种优雅的方式来传达key这些不同的可执行文件之间 即当我调
  • 递增指针 (ptr++) 和 (*ptr++)

    当我有这个疑问时 我正在重新审视指针 int ptr int arr 5 10 20 30 40 50 ptr arr 0 Now printf Value d ptr 会打印10 if I do ptr printf Value d pt
  • 我如何告诉 R 正确舍入?

    我如何告诉 R 正确舍入 R 中的小数位数 我遇到了一个不知道如何解决的问题 我希望 R 计算 5 26 100 19 230769 x lt 5 26 100 x 给我 1 19 23077 让我们尝试使用 round 首先将数字设置为
  • 通过 pyCurl 上传文件

    我正在尝试将以下curl代码转换为pycurl 我不想使用请求 我需要使用 pycurl 因为 requests 在我的旧 python 版本中不能完全工作 curl X POST H Accept Language en F email
  • 如何将 amazon S3 存储桶策略设置为除管理员之外的所有人私有?

    我有一个存储桶 我不小心将数千个带有 ACL 的文件上传到 public read 我希望除生成的访问 URL 之外的所有文件均不可用 我尝试创建一个存储桶策略 拒绝所有人的所有操作 并允许我的所有操作 它不起作用 即使生成了访问 URL
  • 将 DataTable 转换为 XML 文件,反之亦然

    我在将 XML 文件读取到DataTable 最初 我正在写一个Datatable到 XML 文件并保存 现在 当我想将 XML 文件读回到DataTable 它没有发生 以下代码用于写入文件 private void saveAsTool
  • Elastic Search:具有自定义类型的一个索引来区分文档模式 VS 多个索引,每个文档类型一个索引?

    我在 ES 方面没有经验 我的背景更多是关系数据库 我试图实现在我的 Web 应用程序中拥有一个搜索栏来搜索它的全部内容 或者我愿意索引的内容 的目标英语 实现的架构是 Jamstack 其中 gatsby 应用程序从 Strapi 应用程
  • 错误:“无法分配给‘Bool’类型的不可变表达式”?

    我该如何解决 我是一名新编码员 谢谢 我收到以下错误 无法分配给 Bool 类型的不可变表达式 当我尝试将 isSelected 设置为false and true IBAction func onFilter sender Any if
  • 使用 Sympy 方程进行绘图

    创建 Sympy 方程 求导 然后绘制该方程的结果的最佳方法是什么 我有符号方程 但无法弄清楚如何制作用于绘图的值数组 这是我的代码 from sympy import symbols import matplotlib pyplot as
  • 使用 protobuf-net 进行惰性、流驱动的对象序列化

    我们正在开发一个用于流式传输大量数据的 WCF 服务 因此我们选择使用WCF 流式传输 http msdn microsoft com en us library ms733742 aspx功能结合protobuf网络 http code
  • 如何区分用户是否处于订阅试用期或不在google play?

    我正在实现一项服务器端服务 用于检查用户的 google play 订阅状态 我使用 Android Publisher API https developers google com android publisher api ref p
  • Rails3 & Git & Heroku - 开发/登台服务器

    我有一个 Rails 3 应用程序 正在与一个使用 Git Github 的团队一起开发 并部署到 Heroku cedar 堆栈 我们的 Github 存储库有 2 个主要分支 Master 和 Development 我想定期将我们的开
  • REST 查询中的 UTF-8 编码字符未正确呈现

    我正在使用一个外部 REST 服务 该服务以 UTF 8 编码提供所有内容 由于某种原因 我的应用程序无法正确处理响应 如果我转储回复 我会看到像 Lule 应该是 Lule 这样的东西 编辑 如果我将字符串转发 不更改 到 UI 也会发生
  • 如何让 toString() 返回多行字符串?

    我正在开发一个程序 该程序搜索数组并找到最小值 然后打印出跑步者的时间 名字和姓氏 我需要弄清楚如何在不同的行上返回三个值 例如 public String toString return String format firstName l
  • Java 同步 String IllegalMonitorStateException

    我试图让 Thread2 等待 String 并让 Thread1 通知 String 更新 我确实同步了 String 对象 如下面的代码所示 但我仍然得到IllegalMonitorStateException这是我的代码 public
  • CreateFile 无法共享串行 (COM) 端口

    The 创建文件 https msdn microsoft com en us library windows desktop aa363858 v vs 85 aspx函数对于打开文件或设备进行读 写访问非常有用 提供句柄 第三个参数 d