EnumPorts()在某些计算机上返回奇怪的错误

EnumPorts() returns strange error on some machines

本文关键字:返回 错误 计算机 EnumPorts      更新时间:2023-10-16

我维护一个应用程序,该应用程序使用win32 EnumPorts()函数来帮助确定计算机上安装的串行端口集。我在一些计算机上看到过这样的情况:获取此信息的调用失败,GetLastError()代码为1722(RPC服务器不可用)。我认为这与注册表设置或所需服务被禁用有关,但到目前为止,我的搜索一直没有结果。其他人遇到过这个问题吗?

作为对Euro Micelli评论的回应。我特别尝试填写一个选择列表,允许用户选择一个可用的选择列表。首先,我完全依赖EnumPorts()来为我提供一个潜在串行端口名称的列表。然而,事实证明,它在几个方面是不可靠的:它并不总是提供完整的端口名称集,而且,正如我最近看到的,当"RPC服务不可用"时,它可能会完全无法运行。为什么需要RPC来找出本地机器上有哪些可用的端口,我完全无法理解,但事实确实如此。后一个问题是最后一根稻草。到目前为止,我完全依赖于提供的名称列表,使用GetDefaultCommConfig()函数过滤这些名称,以确定我所想到的每个名称的确切性质。

根据我的经验,前面提到的注册表项提供的名称列表是获取端口名称的最可靠方法。事实上,当我在设备设备管理器中禁用端口驱动程序时,我可以看到密钥得到更新。根据正常的经验,我同意这样的评估,即依赖特定的钥匙充满了危险。然而,在这种情况下,M$从未提供一个像样的机制来评估可用端口的名称。

我应该指出,我已经用一种扫描注册表项的算法替换了对EnumPorts()的调用:HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM的串行端口名。这应该会在我的软件发布后解决问题。我所追求的是可以提供给目前正在使用已发布包的客户的指针。

我不是EnumPorts方面的专家,但我强烈建议不要依赖注册表项。

  • 关键定义可能在未来发生变化
  • 关键定义可能不是你想的那样
  • 可能有一些方法可以"成为一个串行端口",但不包括这些密钥
  • 密钥可能无法反映最新状态等

您应该始终依赖可用的API。

如果API不为您服务,让我们试着找出原因。也许有一点额外的信息,我们可以更好地帮助:

您到底需要对串行端口做什么?

现在有很多奇怪的串行端口:USB串行电缆、蓝牙、带GPS的手机调制解调器,。。。它可能是插在电脑上的东西,从此被遗忘了很久。

要找出导致问题的端口,您可以尝试进入设备管理器,在"查看"选项卡中选择"显示隐藏设备",然后删除它们,直到问题消失。这可能会让你专注于这个问题。

我知道这不是您问题的直接答案,但您是否考虑过使用不同的方法来枚举串行端口?在我的应用程序中,我使用设置API,使用来自P J Naughter网站的代码:http://www.naughter.com/enumser.html,我发现它运行良好。

我知道这个问题非常古老,但我今天偶然发现了它,并注意到没有人给出解释。

RPC的原因是因为您正在调用后台处理程序函数——您要求后台打印程序返回打印机端口列表,在大多数情况下,该列表恰好包括COM端口。我相信这可以解释你的结果有点不可靠。

RPC用于将请求从进程传递到活动后台处理程序进程,当后台处理程序服务未运行(或未正确响应)时,会出现RPC Server is unavailable消息。