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