【问题标题】:Removing COM Ports in Windows programmatically (Setup API ? )以编程方式删除 Windows 中的 COM 端口(设置 API?)
【发布时间】:2011-04-13 08:47:03
【问题描述】:

我正在寻找一种以编程方式删除由多个蓝牙配对过程创建的虚拟 COM 端口的方法。理想情况下,我想将每个新配对设备(仅一次)映射到同一个虚拟端口。这可以通过 windows setup api 完成吗?

谢谢, 丁斯代尔

【问题讨论】:

  • 对 WMI 类友好...
  • 有什么建议先看哪里?我知道 WMI 主要用于检索系统信息(如大多数示例所示)。你知道解释系统配置本身的资源吗?
  • 我不确定哪个类确切地代表了一个 COM 端口,但this 是一个不错的起点。

标签: c# c++ windows serial-port virtual-serial-port


【解决方案1】:

我会查看 windows DDK 中的 devcon 源代码。我附上了自述文件,这样你就可以看到它有源代码可以完全按照你的意愿去做——禁用串行端口。

DevCon 示例

开发者大会

DevCon 是一个命令行工具,可显示有关设备的详细信息,并允许您从命令行搜索和操作设备。 DevCon 启用、禁用、安装、配置和删除本地计算机上的设备,并显示有关本地和远程计算机上的设备的详细信息。 DevCon 包含在 Windows DDK 中。

关于本文档

本文档描述了 DevCon 源代码,它包含在 Windows DDK 的 /src/setup/devcon 目录中。它解释了 DevCon 的设计,并描述了如何使用 SetupAPI 和设备安装函数来枚举设备并在控制台应用程序中执行设备操作。

有关 DevCon 功能的完整描述和使用说明,请参阅 Driver Development Tools/Tools for Testing Drivers/DevCon 中 DDK 文档中的 DevCon 帮助文件。

范围

这些说明适用于 Windows XP 和 Windows Server 2003。DevCon 设计用于 Windows 2000、Windows XP 和 Windows Server 2003。它不适用于 Windows 95、Windows 98 或 Windows ME。

它是如何工作的

运行“devcon help”将提供命令列表以及每个命令作用的简短描述。 “devcon help” 将对该命令提供更详细的帮助。每个命令的解释是通过位于“cmds.cpp”底部的调度表“DispatchTable”完成的。一些命令使用通用设备枚举器“EnumerateDevices”。当给定远程目标计算机时,其中一些命令将起作用,如果在 Wow64 上使用 32 位 devcon 也将起作用。一些更有趣的函数和它们使用的 API 的描述如下:

cmd类

此命令演示如何使用 SetupDiBuildClassInfoListEx 枚举所有设备类 GUID。函数 SetupDiClassNameFromGuidEx 和 SetupDiGetClassDescriptionEx 用于获取有关每个设备类的更多信息。

cmdListClass

此命令演示如何使用 SetupDiClassGuidsFromNameEx 枚举一个或多个与类名匹配的类 GUID。此命令还演示了如何使用 SetupDiGetClassDevsEx 列出每个类 GUID 的所有设备。

cmdFind cmdFindAll cmdStatus

简单地使用 EnumerateDevices(解释如下)列出设备并显示有关每个设备的不同级别的信息。请注意,除了 cmdFindAll 之外的所有设备都使用 DIGCF_PRESENT 来仅列出有关当前存在的设备的信息。这些和相关设备的主要功能在 FindCallback 中完成。

cmdEnable cmdDisable cmdRestart

这些命令显示如何发出 DIF_PROPERTYCHANGE 来启用设备、禁用设备或重新启动设备。这些命令中的每一个的主要功能都在 ControlCallback 中完成。

这些操作不能在远程机器上或在 Wow64 的上下文中完成。不应使用 CFGMGR32 API,因为它们会跳过类和共同安装程序。

cmd更新

此命令显示如何使用 UpdateDriverForPlugAndPlayDevices 将所有设备的驱动程序更新为特定驱动程序。通常不会指定 INSTALLFLAG_FORCE 以允许 UpdateDriverForPlugAndPlayDevices 确定是否存在已知的更好匹配。在 DevCon 中指定它允许 DevCon 更有效地用作调试/测试工具。这不能在远程机器上或在 Wow64 的上下文中完成。

cmd安装

cmdUpdate 的一种变体,用于在没有关联硬件时安装驱动程序。它创建一个新的根枚举设备实例,并将其与命令行上指定的组成硬件 ID 相关联(应对应于 INF 中的硬件 ID)。这不能在远程机器上或在 Wow64 的上下文中完成。

cmd删除

删除设备的命令。移除的即插即用设备将重新出现以响应 cmdRescan。此命令的主要功能是在演示 DIF_REMOVE 使用的 RemoveCallback 中。这不能在远程机器上或在 Wow64 的上下文中完成。不应使用 CFGMGR32 API,因为它们会跳过类和共同安装程序。

cmd重新扫描

此命令显示了重新扫描所有即插即用设备的正确方法,这些设备之前可能已被删除,或者需要重新扫描才能检测到它们。

cmdDPAdd

此命令允许您将驱动程序包添加到机器。此命令的主要功能演示了 SetupCopyOEMInf 的使用。向机器添加驱动程序包并不意味着驱动程序已安装在设备上,它只是意味着当插入新设备或更新现有设备时,驱动程序会自动可用。

cmdDPDelete

此命令允许您从机器上卸载驱动程序包。此命令的主要功能演示了 SetupUninstallOEMInf 的使用。从机器中删除驱动程序包不会卸载与设备关联的驱动程序。如果您想同时完成这两个操作,请在使用给定驱动程序包的所有设备上使用 cmdRemove,然后使用 cmdDPDelete 从机器中删除驱动程序包本身。此功能在 Windows 2000 或更早版本中不可用。

cmdDPEnum

此命令允许您枚举当前安装在计算机上的所有第 3 方驱动程序包,还向您展示如何从驱动程序包中获取一些常见属性(提供程序、类描述、DriverVer 日期和版本)。

cmdDPEnumLegacy

此命令向您展示如何在 Windows Server 2003 和更早的操作系统上枚举第 3 方驱动程序包。

重启

此功能显示如何从硬件安装程序正确重启机器。特别是它会将标志传递给 ExitWindowsEx,从而导致重新启动与硬件安装相关联。切勿不必要地重启机器。

枚举设备

演示使用 SetupDiGetClassDevsEx 枚举所有设备或所有现有设备,全局或仅限于特定安装程序类。演示如何使用 SetupDiCreateDeviceInfoListEx 创建与类关联或不关联的空白列表(大多数情况下,空白列表不需要与类关联)。演示如何使用 SetupDiOpenDeviceInfo 将设备实例添加到设备信息列表中。在将 CFGMGR32 API 与 SETUPAPI API 混合时,最后两个 API 非常适合从设备实例和机器名称获取 DeviceInfoData 结构。调用 SetupDiGetDeviceInfoListDetail 以获取可以传递到 CFGMGR32 API 的远程机器句柄。调用 SetupDiEnumDeviceInfo 以枚举设备信息列表中的每个设备(显式添加或由 SetupDiGetClassDevsEx 调用确定)。实例 ID 通过调用 CM_Get_Device_ID_Ex 获得,使用 devInfo(从 SetupDiEnumerateDeviceInfo 获得)和 devInfoListDetail(从 SetupDiGetDeviceInfoListDetail 获得)中的信息。调用 GetHwIds 以获取硬件和兼容 ID 的列表(如下所述)。一旦确定了感兴趣的设备(通常通过检查硬件 ID),就会调用回调以在该单个设备上进行操作。

GetHwIds

显示如何使用 SetupDiGetDeviceRegistryProperty 获取设备的硬件 ID 或兼容 ID 的完整列表。

获取设备描述

显示如何获取有关设备的描述性信息。如果存在则使用友好名称,否则使用设备描述。

DumpDeviceWithInfo

展示如何在给定 HDEVINFO(设备信息列表)和 PSP_DEVINFO_DATA(设备信息数据)的情况下获取实例 ID(或使用任何 CFGMGR32 API)。

转储设备状态

显示如何解释 CM_Get_DevNode_Status_Ex 返回的信息。此 API 返回的信息请参阅 cfg.h。

转储设备资源

展示如何获取有关设备使用的资源的信息。

DumpDeviceDriverFiles

作为调试帮助提供,获取有关显然用于设备的文件的信息。它使用 SetupDiBuildDriverInfoList 来获取有关用于指定设备的驱动程序的信息。可以通过调用 SetupDiEnumDriverInfo 枚举与设备关联的驱动程序列表。在这种情况下,列出的驱动程序不会超过一个。此函数继续使用 DIF_INSTALLDEVICEFILES 获取通常会为此驱动程序复制的文件列表。 SetupScanFileQueue 用于枚举文件队列以显示与驱动程序关联的文件列表。

DumpDeviceDriverNodes

作为调试辅助,此函数确定设备的兼容驱动程序列表。它使用 SetupDiBuildDriverInfoList 来获取兼容驱动程序的列表。在这种情况下,会枚举所有驱动程序,但通常会一起使用 DIF_SELECTBESTCOMPATDRV 和 SetupDiGetSelectedDriver 来查找操作系统认为哪个驱动程序最好。

转储设备堆栈

此函数确定类和设备的上限和下限过滤器。

构建 DEVCON 示例

构建 devcon 示例:

  1. 单击 Development Kits Build Environments 子菜单中选择的 Build Environment 图标。这将设置正确的构建环境来构建此示例。请注意,此示例将在 64 位环境和 32 位环境中构建。

  2. 在命令窗口中,切换到包含 DevCon 源代码的目录。例如:

cd src\setup\devcon

  1. 使用宏 BLD 或从命令提示符运行以下命令:

构建-c

这会调用生成 Build.log、Build.wrn 和 Build.err 日志文件的 Microsoft make 例程。

构建完成后,可执行文件将放置在 Sources 文件中指定目录的 ObjXXX\I386 子目录中(取决于选择的构建环境)。

如果构建不成功,请检查以下错误:1) 构建环境设置不正确,或 2) 对示例源代码的修改引入了错误。

使用开发者大会

DevCon 在 tools\devcon 中以随时可用的形式提供。使用方法请参考 devcon.exe 提供的文档。 DevCon 是一个带有内置文档的命令行实用程序,可通过键入“devcon help”获得。

测试

键入“devcon find *”以列出本地计算机上所有现有设备的设备实例。

键入“devcon status @root\rdp_mou\0000”以列出终端服务器鼠标驱动程序的状态。

键入“devcon status PNP05”以列出所有 COM 端口的状态。

【讨论】:

  • 嗨伊万,看起来很有前途!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 2017-07-13
  • 2013-02-21
相关资源
最近更新 更多