2012-04-06 125 views
1

我在我的应用程序有以下功能:为什么打印PChar到控制台时会出现问号?

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

所有我想要做的就是打印这样的结果到控制台。尽管如此,当我拨打电话WriteLn时,我得到的全部是???????????作为回应。

我假设控制台不知道如何打印这个。也许它是Unicode或者什么,它不能被打印?

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

+0

你确定函数声明是正确的吗?大多数DLL调用要求您提供它们填充的缓冲区;您分配缓冲区,将其传入,并返回缓冲区填充DLL信息。返回PChar类型是非常不寻常的,因为DLL将分配内存和指针返回到它的调用应用程序,它没有办法释放它(除非他们都在Delphi/C++ Builder的编制和使用'ShareMem' )。你从哪里得到你正在使用的声明? – 2012-04-06 19:49:33

+0

将PChar更改为PAnsiChar,问题消失。这不是一个重复的约30个其他问题,来自那些没有把Ansi交给Unicode delphi类型的人('PChar'用于表示'PAnsiChar',现在它意味着'PWideChar') – 2012-04-07 18:48:41

回答

1

那么你可能要发布更多的代码,如果这是错误的,但我会像预期

Var 
    FuncResult : String; 
Begin 
    FuncResult := GetDeviceChannelInfo(...); 
    WriteLn(FuncResult); 
End; 

工作的一些事情。

基本上只是迫使从PChar到String的一些暗示;

+0

感谢您的回应。我试了一下。当这样做时,结果是一个空字符串而不是??????????。不知道为什么发生这种情况 – user489041 2012-04-06 16:20:43

+0

建议虽然此功能可能会返回PChar,一个PChar到什么是未知的。必须对结果进行解码以找出应该使用的结果。 – 2012-04-06 17:32:43

3

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

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

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

如果您使用的是较早版本的Delphi,函数确实返回PWideCharwchar_t*,在C),那么你可以得到相反的问题,打印窄字符时的功能给你宽字符。不过这不太可能,因为无论如何,接收到的宽字符都只是ASCII问题,所以在打印第一个字符并遇到构成宽字符后半部分的nul字节后,程序将停止。

您可以使用调试器给自己一个你真正拥有的东西的概念。获取该函数提供的地址并访问内存浏览器中的该地址(CPU视图的一部分)。您可以让Delphi以不同的格式显示内存,包括字符,宽字符和各种宽度的数字。如果你有一些关于你应该得到什么结果的想法,这也有帮助。然后你可以识别内存中的模式。

相关问题