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

Posted

技术标签:

【中文标题】EnumPorts() 在某些机器上返回奇怪的错误【英文标题】:EnumPorts() returns strange error on some machines 【发布时间】:2008-10-08 19:26:42 【问题描述】:

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

回答 Euro Micelli 的 cmets。我特别试图填写一个允许用户选择可用选项列表的选项列表。首先,我完全依赖 EnumPorts() 来为我提供一个可能的串行端口名称列表。它已被证明是不可靠的,但在几个方面:它并不总是提供完整的端口名称集,而且,正如我最近看到的,当“RPC 服务不可用”时,它可能完全无法运行。为什么需要 RPC 来找出本地计算机上可用的端口完全超出了我的范围,但它确实存在。后一个问题是最后一根稻草。就完全依赖提供的名称列表而言,我使用 GetDefaultCommConfig() 函数过滤这些名称以确定我想出的每个名称的确切性质。

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

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

【问题讨论】:

【参考方案1】:

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

未来可能会更改关键定义。 关键定义可能不是您想的那样。 可能有一些方法可以“成为串行端口”,但不包括这些键。 密钥可能无法反映最新状态等。

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

如果某个 API 不适合您,让我们尝试找出原因。也许通过一些额外的信息,我们可以提供更好的帮助:

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

【讨论】:

【参考方案2】:

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

要找出导致问题的端口,您可以尝试进入设备管理器,在“查看”选项卡中选择“显示隐藏的设备”并删除它们,直到问题消失。这可能会让你在问题上归零。

【讨论】:

我试过没有用。问题似乎是 EnumPorts() 无法连接到本地机器(我认为这就是 RPC 服务器相关的原因)【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

以上是关于EnumPorts() 在某些机器上返回奇怪的错误的主要内容,如果未能解决你的问题,请参考以下文章

电报机器人奇怪的错误:错误的请求:指定了错误的文件标识符/HTTP URL

在 laravel 中查看某些 id 的返回错误

为啥在某些机器上堆栈溢出,但在另一台机器上出现分段错误?

WebRequest 奇怪的 NotFound 错误

GetRequestStream() 返回 WebException 超时...但仅在某些机器上

奇怪的构建错误 .Net Core 项目