2012-03-30 20 views
2

標準出力デバイスからハンドルを(hStdOutここ)を考えると、私は、コンソールアプリケーションから任意の文字列の書き込みには、以下の2つの手順を使用します。コンソール画面のバッファにUnicode文字列を書き込むにはどうすればいいですか?

抜粋:

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...'); 

私の質問:

WriteFileの「WideStringの」オーバーロードがありますか私は、コンソールスクリーンバッファにアクセスする他のUnicode対応機能を検討する必要がありますか?

答えて

4

1つの問題は、バイト文字ではなく、バイトの長さを指定する必要があることです。したがってLengthではなくByteLengthを使用してください。現在、あなたが渡しているものはlenで、バッファのバイトサイズの半分です。

nNumberOfBytesToWritelpNumberOfBytesWrittenパラメータに同じ変数を使用しないでください。あなたのstdoutはUTF-16でエンコードされたテキストを期待されている場合

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; 

上記の罰金です。そうでない場合は、ANSIテキストが必要な場合はAnsiStringに切り替える必要があります。

標準出力デバイスに送信する必要がある内容は、どのようなテキストエンコードが期待されているかによってわかりますが、わかりません。

最後に、これがあなたが書いているコンソールであれば、単にWriteConsoleを使うべきです。

+0

ありがとうございます。長さの問題は、ByteLengthを使用して解決されていますが、私はまだ問題があります。文字列のすべての文字は、追加のスペース文字で表示されます。 – menjaraz

+0

@menjarazはい、あなたの標準出力デバイスがANSIを期待しているからです。答えの2番目のコードを試してみてください。どのタイプの出力デバイスについて作業しているかについての情報はありますか? –

+0

あなたはそうです、それはANSIを期待しています。 – menjaraz

関連する問題