delphi - 为什么我在控制台打印 PChar 时会出现问号?

标签 delphi console

我的应用程序中有以下功能:

function GetDeviceChannelInfo_HSI(PortNumber, Address, ChNumber: Integer;
  var State: Integer): PChar; stdcall; external DLL_FILENEAME;

我要做的就是将结果打印到控制台。但是,当我调用 WriteLn 时会发生什么?在它上面,我得到的只是???????????作为回应。

我假设控制台不知道如何打印它。也许它是Unicode或其他东西,它不能被打印?

我是 Delphi 的新手,真的不知道为什么会这样。我实际上是在打印指针地址吗?我真的不知道。任何帮助,将不胜感激。

最佳答案

您没有打印指针地址。如果你是,你会得到一个看起来像地址(十进制或十六进制数)的东西,而不是问号。

截至 2009 年德尔福,PChar是指向 Unicode 字符的指针。如果您使用的是该版本或更高版本,请确保这是您的函数真正返回的内容。该函数更有可能返回一个指向非Unicode字符的指针——如果你从函数返回char*的C代码中翻译它,它将返回一个指针。 .该类型的正确 Delphi 翻译是 PAnsiChar .

当您打印不是真正字符的宽字符,或者在当前字体中没有表示的宽字符时,您通常会得到问号。

如果您使用的是较早的 Delphi 版本,并且该函数确实返回 PWideChar ( wchar_t* ,在 C 中),那么您可能会遇到相反的问题,当函数为您提供宽字符时打印窄字符。不过,这不太可能,因为您收到的宽字符无论如何都是 ASCII 问题,因此您的程序会在打印第一个字符并遇到构成宽字符后半部分的 nul 字节后停止。

您可以使用调试器让自己了解您真正拥有的东西。获取函数提供给您的地址,然后在内存浏览器(CPU View 的一部分)中访问该地址。您可以让 Delphi 以不同的格式显示内存,包括字符、宽字符和各种宽度的数字。如果您对应该得到的结果有所了解,这也会有所帮助。然后你可能会识别出内存中的模式。

关于delphi - 为什么我在控制台打印 PChar 时会出现问号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10045967/

相关文章:

ruby-on-rails - Rails 放入控制台

delphi - 反汇编用 Delphi 编写的 DLL——如何开始?

delphi - 如何避免在Delphi中使用插入命名空间

delphi - 将子组件属性类型转换为 ini 文件

c++ - 如何在我的进程绑定(bind)到的控制台中获取行中的字符数?

c - 在 ubuntu 终端窗口中运行文件之前如何消除使用 "./"的需要?

delphi - 如何修复对话框中的RichEdit重绘错误

delphi - 关于设置新 TreeView 数据类型的建议

python - get_serving_url 通过 remote_api_shell.py

linux - 文件名看起来一样,但复制后不同