web-dev-qa-db-ja.com

Windowsでのchar *とLPSTRの違い

基本的な質問なのか、ばかげた質問なのか、お詫び申し上げます。違いは何ですか char*およびLPSTR。ここで、sizeofは両方とも私のコンパイラで4バイトを与えます。誰かが私を詳しく説明できますか?ありがとう..

18
2vision2

LPSTRWindowsタイプであり、コンパイルしているプラ​​ットフォームに関係なく同じであることを意味します。文字列への長いポインタです。

セグメント化されたアーキテクチャ(新しいセレクタベースのセグメント化されたメモリではなく、古い64Kセグメント)の時代には、小、小、中、大、大のメモリモデルがあり、Windowsの種類が常に同じであることが重要でした。ポインタの種類に関係なくchar *

したがって、基になる型が異なるさまざまなコンパイラに準拠した場合、windows.hヘッダーファイルはそれを補うためにLPSTRを定義します。

たとえば、BorlandCには16ビットのchar *があり、LPSTRfar char *として定義する必要があった可能性があります。 char *がすでにlong/farポインターであったコンパイラーでは、LPSTRは代わりにそれを使用していました。

今日では、32ビット以上のフラットモデルでは、おそらくそのようなシェナニガンは実際には必要ありませんが、64ビット間のサンクなどで可能性がありますおよび32ビットコード。それでも、そこで定義されたタイプはまだ私たちと一緒にあり、まだ非常に使用されています。

21
paxdiablo

基本的に、LP *ポインターは、16ビットバージョンのWindowsで32ビットポインターを使用することを示していました。

から ウィキブックス

文字「LP」または接頭辞「lp」は「ロングポインタ」を表し、32ビットマシンの通常のポインタとまったく同じです。 LPデータオブジェクトは、ポインタと長いポインタを区別する必要があるときにWindows3.1以降から引き継がれた単なるレガシーオブジェクトです。最新の32ビットシステムでは、これらのプレフィックスは同じ意味で使用できます。

7
StuartLC

違いは時間の深さに埋もれています。 LPSTRは、「文字列への長いポインタ」の略です。 32ビットプロセッサの前に戻ると、メモリの別のセグメントにある可能性のあるメモリへのポインタ(メモリ内で遠く離れていると考えてください)には、格納するための追加のスペースが必要でした。

32ビット(およびそれ以降)のプロセッサでは、まったく同じものです。マイクロソフトは、歴史的な理由でのみLPSTRを使用しています。

4
Martin