代码之家  ›  专栏  ›  技术社区  ›  Jon Trauntvein

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

  •  3
  • Jon Trauntvein  · 技术社区  · 16 年前

    作为对欧洲胶束评论的回应。我特别尝试填写一个选择列表,允许用户选择一个可用的选择列表。首先,我完全依赖EnumPorts()来提供可能的串行端口名列表。然而,在某些意义上,它被证明是不可靠的:它并不总是提供完整的端口名集,而且,正如我最近看到的,当“RPC服务不可用”时,它可能无法完全运行。为什么需要RPC来找出本地计算机上可用的端口完全超出了我的能力范围,但事实确实如此。后一个问题是最后一根稻草。只要完全依赖于提供的名称列表,我就使用GetDefaultCommConfig()函数过滤这些名称,以确定每个名称的确切性质。

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

    4 回复  |  直到 10 年前
        1
  •  1
  •   Euro Micelli    16 年前

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

    • 关键定义将来可能会改变。
    • 可能有办法“成为一个串行端口”不包括这些键。
    • 密钥可能无法反映最新状态等。

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

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

        2
  •  0
  •   Andrew Queisser    16 年前

    要找出导致问题的端口,您可以尝试进入设备管理器,在“查看”选项卡中选择“显示隐藏设备”并删除它们,直到问题消失。这样你就可以集中精力解决这个问题了。

        3
  •  0
  •   ChrisN    16 年前

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

        4
  •  0
  •   Valdar Moridin    10 年前

    我知道这个问题已经很老了,但我今天无意中发现了这个问题,没人给我解释。

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

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