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

时间:2008-10-08 19:26:43

标签: c++ winapi

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

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

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

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

4 个答案:

答案 0 :(得分:1)

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

  • 关键定义将来可能会发生变化。
  • 关键定义可能不是您的想法。
  • 可能有“成为串口”的方法,不包括这些键。
  • 密钥可能无法反映最新状态等。

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

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

您需要对串口进行什么操作?

答案 1 :(得分:0)

现在有很多奇怪的串口:USB串口线,蓝牙,带GPS的手机调制解调器......可能是插在电脑上的东西,很久以后就被遗忘了。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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