掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
WriteFileの引数const Bufferとは何ですか? (ID:18774)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
こんばんは。 >> ヘルプにはstring型(長い文字列)は、文字列を指すポインタで >> あると記載されているように思うのですが、どうなのでしょうか? >いいえ、ちがいます。 >長い文字列=AnsiStringは、文字列を指すポインタの前に、文字数および参照カウンタが存在します。 そうなんですが、string 型に変数は何を保持しているのか、というと procedure TForm1.Button1Click(Sender: TObject); var s: string; begin s := '1234'; Label1.Caption := IntToHex(Cardinal(PChar(s)), 8); Label2.Caption := IntToHex(Cardinal(s), 8); end; が同じ値をしめすことから、やはり、文字列の先頭へのアドレスを保持しているんですよね。 だから >ただし、PCHARでキャストすると、文字列を指すポインタとなります。 PChar にキャストできるわけなんですが。今回の const Buffer については、VCL の 他のメソッドでも多用されていて、わたしにはちょっとうまく説明できないのですが、 該当メモリの先頭の変数をそのまま指定するといいように思います。にしのさんの しめされた多くの例がそれを支持しているように思います。 ただ、文字列のリテラルがどうしてうまくいくのか、よく分かりません。 あと、今回の場合は API なので、もともとのプロトタイプは BOOL WriteFile( HANDLE hFile, // handle to file to write to LPCVOID lpBuffer, // pointer to data to write to file DWORD nNumberOfBytesToWrite, // number of bytes to write LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written LPOVERLAPPED lpOverlapped // pointer to structure needed for overlapped I/O ); なんですよね。第二引数は、型なしポインタなので PChar(s) ではなく PChar(s)^ であることが不思議です。 すみません、わたし自身は慣れきっているのでまずコーディングに失敗することは ないのですが、あらためて考えると不思議な気もします。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.