Delphi中使用SetupDiGetClassDevs进行串口枚举

2023-12-15

我正在尝试枚举 COM 端口的“友好名称”。当 USB 串行设备在运行时连接和断开时,端口可能会动态变化。

基于中描述的可能方法这个问题,我正在尝试使用 SetupDiGetClassDevs 方法。

I found 这个示例代码,但它是为旧版本的 setupapi 单元编写的(到 homepages.borland.com 的原始链接当然不起作用)。

我尝试使用当前 JVCL 中的 setupapi 单元(JVCL340CompleteJCL221-Build3845),但它似乎与 Delphi 7 不兼容。我收到编译器错误:

if SetupDiGetDeviceRegistryProperty(DevInfoHandle,DeviceInfoData,
    RegProperty,
    @PropertyRegDataType,
    @S1[1],RequiredSize,@RequiredSize) then begin

在函数调用中设置DiGetDeviceRegistryProperty, 我在参数上收到错误“实际参数和形式参数的类型必须相同”@PropertyRegDataType, and @RequiredSize.

Delphi3000 网站说该代码是在 2004 年编写的,适用于 Delphi 7,所以我不确定为什么它现在不能在 Delphi 7 上运行,除非 setupapi 已更改。有人熟悉可能导致这些问题的 setupapi 更改吗?

我正在使用一个简单的控制台程序进行测试。使用声明是“windows, 系统实用程序, 课程, 设置API, 登记处;”

主要程序是:

  begin
  ComPortStringList := SetupEnumAvailableComPorts;
  for Index := 0 to ComPortStringList.Count - 1 do
      writeln(ComPortStringList[Index]);
  end;
  end.

以下过程对我来说工作正常(在 Windows 8.1 中)。使用参数很重要KEY_READ in the TRegistry.Constructor.

procedure  EnumComPorts(const   Ports:  TStringList);

var
  nInd:  Integer;

begin  { EnumComPorts }
  with  TRegistry.Create(KEY_READ)  do
    try
      RootKey := HKEY_LOCAL_MACHINE;
      if  OpenKey('hardware\devicemap\serialcomm', False)  then
        try
          Ports.BeginUpdate();
          try
            GetValueNames(Ports);
            for  nInd := Ports.Count - 1  downto  0  do
              Ports.Strings[nInd] := ReadString(Ports.Strings[nInd]);
            Ports.Sort()
          finally
            Ports.EndUpdate()
          end { try-finally }
        finally
          CloseKey()
        end { try-finally }
      else
        Ports.Clear()
    finally
      Free()
    end { try-finally }
end { EnumComPorts };
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi中使用SetupDiGetClassDevs进行串口枚举 的相关文章

  • Winform 没有.NET 框架?

    我必须创建一些表单并将其作为直接 EXE 提供 而不是安装程序 它安装 NET 框架 最终用户对此不满意 他们想要可以直接打开和工作的东西 我知道它可以作为网络完成 但我正在寻找 winforms 吗 请建议哪种工具 技术可以处理这个问题
  • 调用泛型类型的方法?

    为什么下面的代码在 Delphi XE 中会产生错误 unit UTest interface type TTest class public procedure Foo
  • 从单个应用程序中的多个线程调用 dll 函数是否安全?

    我正在 Delphi 2009 中编写一个服务器应用程序 它实现了多种类型的身份验证 每种身份验证方法都存储在单独的 dll 中 第一次使用身份验证方法时 会加载适当的 dll 仅当应用程序关闭时 DLL 才会被释放 在服务器线程 连接 之
  • EIdOSSLUnderlyingCryptoError 和“使用 SSL 连接时出错。错误:14094410...”

    我在 OS X 上的 Delphi 10 1 Berlin 中遇到 Indy 组件问题 我正在使用TIdHTTP使用 HTTPS 连接到 Web 服务 问题是从 OS X 客户端连接到服务器 在 OS X 上运行时 我总是遇到同样的错误 P
  • 能否从 Vista Shell 获取 48x48 或 64x64 图标?

    如果 Vista Shell 中存在 48x48 或 64x64 图标 如何使用 SHGetFileInfo 获取在 TImage 中显示图标的句柄 我想从图像列表中选择一个代表文件夹路径的图标 并在 Timage 中显示 48x48 或
  • 为应用程序启用主题

    我有一个旧的应用程序 在Win XP中的delphi 7中启动 现在我正在使用delphi 2009 win Vista 如果我开始一个新项目 所有按钮都有一个圆形边缘 但在我的旧应用程序中 所有按钮都有 方形 形状的外观 有什么设置我错过
  • 在 SQLite 数据库中存储日期时间值的最佳方式(Delphi)

    我将把日期时间值存储在 SQLite 数据库中 使用 Delphi 和 DISqlite 库 数据库的本质是它永远不需要在计算机或系统之间传输 因此互操作性不是一个限制 相反 我的重点是阅读速度 日期时间字段将被索引 我将对其进行大量搜索
  • DELPHI 和 WANT 或 NANT

    We use 巡航控制 net http confluence public thoughtworks org display CCNET Welcome to CruiseControl NET在 Delphi 2006 应用程序中进行持
  • 如何在Android studio中调用.so库上的方法

    编辑 请参阅我的第一个答案 我想在我的项目中使用 android 串口 api 我这样做有很多麻烦 关于如何配置旧版本的 gradle 或如何使用 NDK 进行编译 存在大量相互冲突的信息 而这两者都没有用 我完全迷失了 我发现唯一可能正确
  • 如何使用 Gmail 的 SMTP 和 Indy 10 发送电子邮件?

    我正在使用 Delphi 2009 和 svn 中最新的 Indy 10 通过 SMTP 发送电子邮件 但它不适用于 Gmail Google Apps 托管域 当我尝试发送电子邮件时 我收到 必须首先发出 STARTTLS 命令 我尝试用
  • Delphi 2010 - 从 XML 文档解码 Base64 编码图像

    我正在尝试从应用程序中的 XML 文档解码 base64 编码的 EMF 图像并将其呈现在屏幕上 但是 它似乎从未出现 如果我将 XML 文档中的数据复制 粘贴到 Notepad 中并使用Base64 Decode选项并将文件另存为 emf
  • 对象的引用计数

    在我的代码中 我使用一个小的数据存储类 它是在不同的地方创建的 为了避免内存泄漏并简化事情 我想使用引用计数 所以我这样做了 type TFileInfo class TInterfacedObject IInterface 并删除了我对
  • 如何用不同的颜色绘制选定的列表框项目?

    是否可以更改 TListBox 中的项目选择焦点颜色和文本颜色 当项目中未启用主题或列表框样式设置为所有者绘制时 项目周围的选择将被涂成蓝色 我相信这是由系统的外观设置全局定义的 我想将所选项目的颜色更改为自定义颜色 举个例子 结果会是这样
  • 防止多个实例 - 但还要处理命令行参数?

    我正在从我的应用程序处理与 Windows 相关的扩展文件 因此 当您在 Windows 中双击文件时 它将执行我的程序 然后我从那里处理该文件 如下所示 procedure TMainForm FormCreate Sender TObj
  • 通过套接字发送动态数组(在记录内)?

    我正在尝试直接使用 SendBuf 将记录从服务器传输到客户端 但是 该记录有一个动态数组的成员 并且我在某处 在 SOF 中 读到 发送记录时 成员必须是静态的 固定长度 但问题是 我无法确定如何我会 将来 发送许多论点 我怎么解决这个问
  • 串行 I/O 与 Windows/Windows CE 重叠/不重叠

    抱歉 这不是一个大问题 但更多的是帮助那些在这些特定问题上遇到问题的人 我正在解决的问题需要使用串行 I O 但主要在 Windows CE 6 0 下运行 然而 最近有人问我该应用程序是否也可以在 Windows 下运行 所以我开始着手解
  • 将图像加载到 TImageList 并读取它们?

    我试图通过将 jpg 转换为 bmp 然后将其保存到 imagelist1 来将 jpg 加载到图像列表中 从上到下的代码片段 Selectdir 有效 fileexists 部分有效 这用于加载文件夹中的所有图像 所有图像都以 0 jpg
  • 如何比较枚举类型集

    从某个时刻开始 我厌倦了编写设定条件 and or 因为对于更多的条件或更长的变量名 重新编写会变得笨拙且烦人 所以我开始写助手这样我就可以写ASet ContainsOne ceValue1 ceValue2 代替 ceValue1 in
  • H2161 重复资源[一个VCL项目可以有2个类名相同但命名空间不同的表单吗?]

    我尝试在 2 个不同的命名空间中创建具有相同类名的 2 个表单 FirstNameSpace ExampleFormName TExampleFormName SecondNameSpace ExampleFormName TExample
  • 从其可执行文件的路径获取服务名称

    我有一个可执行文件的路径 它是一个正在运行的服务应用程序 例如 C Program Files x86 Someapp somesvc exe 我想停止并启动它 为此我想我需要获取服务的名称 如下所示 this https stackove

随机推荐

  • ASP MVC3 数据库优先

    我使用ASP MVC3应用程序的实体框架 起初我使用代码优先的方法 我创建了类并使用属性来验证数据字段 public class Person public int ID get set Required ErrorMessage Name
  • 以二进制方式将utf16写入文件

    我正在尝试以二进制模式使用 ofstream 将 wstring 写入文件 但我认为我做错了 这是我尝试过的 ofstream outFile test txt std ios out std ios binary wstring hell
  • 如何在vb代码内的DataTable上的linq中正确执行“group by”?

    为什么以下 group by 子句不起作用 最初的问题是如何在 LINQ 内的 vb 代码 dot net v4 0 中使用 DataTable 和组上的总和执行组 这是示例 但它没有产生所需的输出 它返回 2 行而不是 1 行 Dim t
  • 如何更新 Python 包?

    我正在运行 Ubuntu 9 10 并安装了一个名为 M2Crypto 的软件包 版本为 0 19 1 我需要下载 构建并安装最新版本的 M2Crypto 软件包 0 20 2 0 19 1 软件包在多个位置都有文件 包括 usr shar
  • java中有没有命令可以让程序回到循环的开头

    我正在尝试用java制作一款打字冒险类游戏 但是我需要一个至少类似于标题中的命令 这是代码 import java util Scanner public class MyFirstGameInJava public static void
  • 为什么我会收到此 Oracle 连接错误? ORA-12519,TNS:未找到适当的服务处理程序

    我正在使用 GlassFish Hibernate Spring 用于事务管理 和 Oracle 11g 构建一个 JSF2 应用程序 应用程序运行一段时间后 应用程序无法查询数据库 并且我在 GlassFish 日志中收到以下错误 原因
  • 嵌入 YouTube 视频 - 拒绝在框架中显示,因为它将“X-Frame-Options”设置为“SAMEORIGIN”[重复]

    这个问题在这里已经有答案了 我正在尝试向我的 Django 页面提供从其他地方获得的一些资源 在 feed 中 我有 YouTube 视频 其 URL 如下 https www youtube com watch v A6XUVjK9W4o
  • graph.facebook.com - 传输安全块

    错误 传输安全已阻止明文 HTTP http 资源加载 因为它不安全 可以通过应用程序的 Info plist 文件配置临时例外 当尝试访问 graph facebook com 等时 我已经把 NS允许任意负载在 plist 上 但它不断
  • 添加约束以防止 SQL 更新触发器中出现重复

    我们有一个用户表 每个用户都有一个唯一的电子邮件和用户名 我们尝试在代码中执行此操作 但我们希望确保用户永远不会使用相同的电子邮件用户名插入 或更新 到数据库中 我添加了一个BEFORE INSERT防止插入重复用户的触发器 CREATE
  • 使用英特尔编译器构建 Boost 库

    除了 Visual Studio 2012 之外 我还在 32 位 Windows 7 计算机上安装了 Intel Parallel Studio XE 2013 我尝试按照 Intel 编译器中的说明构建 Boost 1 53link 我
  • 在oracle中只检索表的第二行?

    谁能帮忙 如何从oracle表中准确检索第二行 由于表中的行本质上是无序的 因此 第一个 和 第二个 的概念要求您指定某种强制顺序的方法 即 ORDER BY 子句 最简单的方法是使用解析函数 SELECT FROM SELECT a ro
  • 如何在 SQL Server 中传递两个 sql 表作为 r 代码的输入参数

    我正在 SQL Server 中运行 r 代码 我在 SQL Server 数据库中有两个表 我想将它们作为输入数据集传递到 R 代码中 我可以用 input data 1传递输入数据集之一 我怎样才能通过另一张桌子 我读自一个 MSDN
  • 减少多个 box-shadow 参数的 mixin 问题

    我正在一个项目中工作 我必须减少使用 就我个人而言 我总是使用手写笔 但我不能使用这个项目 所以我有下一个问题 我怎样才能用更少的手写笔做到这一点 问题在于参数的数量 在手写笔中 box shadow webkit box shadow a
  • C++ 中新内存的范围

    当我尝试执行以下操作时 出现错误 提示我正在尝试读取或写入受保护的内存 void func1 int ptr int ptr b new int 5 ptr ptr b void main int ptr a func1 ptr a del
  • NoClassDefFoundError Android 与 ActionBarActivity

    我目前有一个ActionBarActivity它总是返回一个NoClassDefFoundError 我读到这可能是 ADT 的问题 但我不能确定 因此我提出了问题 我已经从 Android 示例中导入了 ActionBar 示例 andr
  • C++ 从向量中删除对象[重复]

    这个问题在这里已经有答案了 我想从向量中删除一个元素 例如 object that is in the vector MyClass obj vector looks as so vector
  • R:2个不同包中的2个同名函数

    我需要加载到 R 包 tseries 和 chron 两者都有一个名为 is weekend 的函数 我的环境中始终具有我加载的第二个包中的函数 我如何才能始终访问 chron 的功能 您可能已经注意到加载包的顺序会有所不同 即最后加载的包
  • 线程池程序在速度更快的服务器上运行速度要慢得多

    upd我现在认为我的问题的根源不是 线程 因为我观察到程序的任何一点都变慢了 我认为当使用 2 个处理器时 我的程序执行速度会变慢 可能是因为两个处理器需要彼此 通信 我需要做一些测试 我将尝试禁用其中一个处理器 看看会发生什么 我不确定这
  • 使用 C++11 的 CUDA 6.0 的 CMake 脚本

    我正在为我的 CUDA 6 0 Boost 1 55 0 OpenCV 2 4 9 项目开发 64 位 Mac OSX 10 9 使用 makefile 进行编译 但由于我最终将在 64 位 Windows 8 1 上测试它 我想我 熟悉
  • Delphi中使用SetupDiGetClassDevs进行串口枚举

    我正在尝试枚举 COM 端口的 友好名称 当 USB 串行设备在运行时连接和断开时 端口可能会动态变化 基于中描述的可能方法这个问题 我正在尝试使用 SetupDiGetClassDevs 方法 I found 这个示例代码 但它是为旧版本