delphi - 从 Delphi 中的 Windows Message 获取串行端口的友好名称

标签 delphi winapi serial-port

我在使用 delphi 从 DEV_BROADCAST_PORT 获取友好名称 (dbcp_name) 时遇到问题。

我尝试使用微软帮助文档,它说它是一个指向空终止字符串的指针,但在该页面上有一条注释表明它是一个可变长度结构,并且 dbcp_name 是一个包含实际值的数组端口名称的字符。

我试图提取这个,但我目前还没有找到一种方法,因为当我让它返回任何东西时,它完全是胡言乱语。

我使用的代码如下:

PDevBroadcastPort = ^DEV_BROADCAST_PORT;

DEV_BROADCAST_PORT = packed record
    dbcp_size : DWORD ;
    dbcp_devicetype : DWORD;
    dbcp_reserved : DWORD ;
    dbcp_name : array[0..0] of ansichar; //TCHAR dbcp_name[1]; not valid
end;

我尝试了不同的数组长度值,我在某处读到这是正确的声明,但我不完全确定。另外,注释掉的行是微软文档中为 C++ 中的行提供的内容

要提取信息,我尝试过以下操作:

var
  PData: PDevBroadcastPort;

  FName: string;

  ...

  PData := PDevBroadcastPort(Msg.lParam);

  ShowMessage('Length '+Inttostr(length(PData^.dbcp_name)));

  FName := '';

  i:=0;

  while((PData^.dbcp_name[i]) <> #0) and (i < 100) do
      begin
          FName := FName + (PData.dbcp_name[i]);

          i := i +1;

          ShowMessage(FName); 
      end;

我尝试将 while 循环设置为在数据结构的长度处终止,但如果我不设置它,那么它会变得很大。

感谢任何帮助,如果我遗漏了此问题所需的任何代码,请告诉我,我将尽快获取它。

谢谢

最佳答案

文档并没有说它是指向空终止字符串的指针;它说它一个以空字符结尾的字符串。对于在记录末尾声明且长度仅为一个元素的数组来说,这是典型的情况。

在指定的记录大小之后实际上还有更多的内存,并且该内存保存字符串的剩余字符。指向该记录字段的指针也是指向字符数据的指针。

FName := PAnsiChar(@PData.dbcp_name);

假设您禁用了该代码段的边界检查,您的数组遍历代码也应该可以工作(否则当程序检测到您读取超出数组的第一个元素时,您会收到异常)。

这一切都预设了 PData 实际上是一个指向 Dev_Broadcast_Port 结构的指针。您没有提供有关您正在传递的消息的任何信息,因此我不知道您是否真的拥有您认为拥有的内容。

如果您使用的是 Delphi 2009 或更高版本,则 C 声明中的 TCHAR 类型相当于 Delphi 的 WideChar 类型。将字段解释为 AnsiChar 数组将会得到错误的结果,尽管对于大多数端口名称来说,该数组可能看起来像是一个以 null 结尾的单字符字符串列表。除非您确定您有非 Unicode 数据,否则您应该只使用 CharPChar,并让 Delphi 版本确定您拥有哪种数据类型。

FName := PChar(@PData.dbcp_name);

关于delphi - 从 Delphi 中的 Windows Message 获取串行端口的友好名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11579216/

相关文章:

delphi - TDictionary 中的内存泄漏 - 有解决方法吗?

Java - 根据从串行端口接收的数据动态更改jLabel文本

c++ - 从串口读取恰好 N 个字节

delphi - Delphi : How to check if webbrowser has successfully loaded the page?

delphi - 将支持 unicode 的 Delphi 2006 应用程序移植到 Delphi 2009

c# - RegisterHotKey 不适用于不可见的表单 (c#)

c++ - 为什么子窗口可能收不到鼠标事件?

windows-7 - SetCommState 在 Windows 7 上失败

delphi - Delphi 的 OpenID 库?

windows - 符号 (&'s) 和不同版本的 Windows