【发布时间】:2012-04-20 06:04:19
【问题描述】:
我正在编写一个与一对硬件传感器接口的 C# 应用程序。不幸的是,在设备上公开的唯一接口需要提供用 Delphi 编写的 dll。
我正在编写一个 Delphi 可执行包装器,它调用 DLL 的必要函数并通过 stout 返回传感器数据。但是,此数据的返回类型是 PWideChar(或 PChar),我无法将其转换为 ansi 以便在命令行上打印。
如果我直接将数据传递给 WriteLn,我会得到“?”对于每个字符。如果我查看字符数组并尝试使用 Ansi 转换一次打印一个字符,则只会打印几个字符(尽管它们确实确认了数据),并且它们通常会乱序打印。 (打印时暴露的索引只是跳来跳去。)我还尝试将 PWideChar 转换为整数:'I' 对应于 21321。我可能会找出所有的转换,但有些数据有很多值。
我不确定 dll 使用的是什么版本的 Delphi,但我相信它是 4。肯定在 7 之前。
感谢任何帮助!
TLDR:需要将 UTF-16 PWideChar 转换为 AnsiString 进行打印。
示例应用:
program SensorReadout;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Windows,
SysUtils,
dllFuncUnit in 'dllFuncUnit.pas'; //This is my dll interface.
var state: integer;
answer: PChar;
I: integer;
J: integer;
output: string;
ch: char;
begin
try
for I := 0 to 9 do
begin
answer:= GetDeviceChannelInfo_HSI(1, Ord('a'), I, state); //DLL Function, returns a PChar with the results. See example in comments.
if state = HSI_NO_ERRORCODE then
begin
output:= '';
for J := 0 to length(answer) do
begin
ch:= answer[J]; //This copies the char. Originally had an AnsiChar convert here.
output:= output + ch;
end;
WriteLn(output);
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
ReadLn(I);
end.`
问题是 PAnsiChar 必须是源自 DLL 的函数的返回类型。
【问题讨论】:
-
您希望输出的文本是什么样的?也许它不能表示为 AnsiString?例如,Unicode 字符串
⌬‽∫∇❦∴φ┶不能“转换”为 AnsiString。 -
文本显示为???。一个示例的预期输出是:“ISO 4190250”,但我得到“????????”。如果我将 char 逐个转换,我会得到 S 和 4,但其他的要么是空的,要么会导致奇怪的 IO 问题。
-
某处可能有一些微妙的错误。我认为您需要展示一个显示此问题的最小项目(带有代码)。
-
对我来说看起来不错。你只是不知道如何解释结果。你声称你得到了一个 PWideChar,但我不认为你真的是。您说第一个字符的数值为 21321。当解释为两个 AnsiChars 时,即为
IS。你得到的是PAnsiChar,而不是PWideChar。你不必转换任何东西。您只需修复导入单元以使用正确的类型,即PAnsiChar,而不是PChar。 -
制造商给了你为 Delphi 4 编写的代码。在 Delphi 4 中,
PChar与PAnsiChar相同,所以代码是正确的,在那个版本中。你正在用 Delphi XE2 编译 Delphi 4 代码,其中PChar的含义不同。
标签: delphi