当我将PChar打印到控制台时,为什么会出现问号?

时间:2012-04-06 15:59:29

标签: delphi console

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

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

我想要做的就是将结果打印到控制台。但是,当我在其上调用WriteLn时,我得到的只是???????????作为回复。

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

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

2 个答案:

答案 0 :(得分:3)

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

自Delphi 2009起,PChar是指向Unicode字符的指针。如果您使用的是该版本或更高版本,请确保这是您的功能真正返回的内容。函数更有可能返回一个指向非Unicode字符的指针 - 如果你从函数返回{C}的C代码中转换它,它就会返回它。该类型的正确Delphi转换是char*

如果您打印的字符不是真正的字符,或者当前字体中没有表示,那么您经常会收到问号。

如果您使用的是早期的Delphi版本,并且该函数确实返回PAnsiCharPWideChar,在C中),那么您可能会遇到相反的问题,在函数给出时打印窄字符你性格宽广。但这不太可能,因为你收到的宽字符无论如何只是ASCII问题,所以你的程序会在打印第一个字符后遇到构成宽字符后半部分的空字节时停止。

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

答案 1 :(得分:1)

如果这是错误的话你可能不得不发布更多的代码,但我已经预料到了一些像

这样的东西
Var
  FuncResult : String;
Begin
  FuncResult := GetDeviceChannelInfo( ...);
  WriteLn(FuncResult);
End;

工作。

基本上只是强制从PChar到String的一些隐含角色;