2008-10-08 44 views
3

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

回答Euro Micelli的评论。我特意试图填写一个选择列表,以便用户选择一个可用的选项列表。首先,我完全依赖EnumPorts()为我提供了一个潜在的串行端口名称列表。但事实证明,这种做法在某种程度上并不可靠:它并不总是提供一组完整的端口名称,正如我最近看到的,当“RPC服务不可用”时它可能无法完全运行。为什么需要RPC来查明本地计算机上的可用端口是否完全超出了我的范围,但它的确存在。后一个问题是最后一根稻草。至于完全依赖提供的名称列表,我使用GetDefaultCommConfig()函数过滤这些名称以确定每个名称的确切性质。

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

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

回答

0

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

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

+0

我都试过,都没有用。这个问题似乎是EnumPorts()是无法连接到本地机器(我假设的是,为什么RPC服务器相关) – 2008-10-08 20:01:39

0

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

1

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

  • 关键定义可能在未来发生变化。
  • 关键定义可能不是你的想法。
  • 有可能是“串口”,不包括这些键。
  • 的按键可能无法反映了最新状态,等等,等等

你应该总是依靠提供的API。

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

究竟是什么,你需要用串口做什么?

0

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

原因RPC是因为你调用后台处理程序的功能 - 你问打印后台处理程序返回的打印机端口,这恰好包括在大多数情况下,COM端口的列表。我相信这可能会解释你的微不可靠的结果。

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

相关问题