1

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

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

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

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

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

4

2 回答 2

3

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

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

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

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

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

于 2012-04-06T16:11:19.337 回答
1

好吧,如果这是错误的,您可能需要发布更多代码,但我本以为会有类似的事情

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

去工作。

基本上只是强制从 PChar 到 String 的一些隐式转换;

于 2012-04-06T16:11:08.123 回答