一个问题是您需要以字节而不是字符为单位指定长度。所以使用ByteLength
而不是Length
. 目前,您传入的len
是缓冲区字节大小的一半。
我也相信你不应该对nNumberOfBytesToWrite
andlpNumberOfBytesWritten
参数使用相同的变量。
procedure Send(const s: string);
var
NumberOfBytesToWrite, NumberOfBytesWritten: DWORD;
begin
NumberOfBytesToWrite := ByteLength(s);
if NumberOfBytesToWrite>0 then
WriteFile(hStdOut, s[1], NumberOfBytesToWrite, NumberOfBytesWritten, nil);
end;
stdout
如果您期望 UTF-16 编码的文本,则上述内容很好。如果不是,并且它需要 ANSI 文本,那么您应该切换到 AnsiString。
procedure Send(const s: AnsiString);
var
NumberOfBytesToWrite, NumberOfBytesWritten: DWORD;
begin
NumberOfBytesToWrite := ByteLength(s);
if NumberOfBytesToWrite>0 then
WriteFile(hStdOut, s[1], NumberOfBytesToWrite, NumberOfBytesWritten, nil);
end;
您需要发送到标准输出设备的确切内容取决于它所期望的文本编码,我不知道。
最后,如果这是您正在写入的控制台,那么您应该简单地使用WriteConsole
.