2

標準出力デバイスへのハンドル(ここでは hStdOut) を指定すると、次の 2 つの手順を使用して、コンソール アプリケーションから任意の文字列を書き込みます。

抜粋:

procedure Send(const s: string);
var
  len: cardinal;
begin
  len:=Length(s);
  WriteFile(hStdOut,s[1],len,len,nil);
end;

procedure SendLn(const s: string);
begin
  Send(s + #13#10);
end;

私の悩み:

このステートメントは、期待どおりに文字列を正しくレンダリングしません。

SendLn('The harder they come...');

私の質問:

「WideString」のオーバーロードはありますか、WriteFileそれともコンソール画面バッファーにアクセスする別の Unicode 対応関数を検討する必要がありますか?

4

1 に答える 1

4

問題の 1 つは、文字数ではなくバイト数で長さを指定する必要があることです。ではなく使用してください。現時点で渡されているのは、バッファのバイト サイズの半分です。ByteLengthLengthlen

nNumberOfBytesToWriteまた、パラメータとパラメータに同じ変数を使用すべきではないと考えていlpNumberOfBytesWrittenます。

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;

stdoutUTF-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.

于 2012-03-30T15:41:23.520 に答える