9

cbSize次の例のように、メンバーを持つWin32API構造体(ただし、それに限定されない)のいくつかの定義に頻繁に遭遇します。

typedef struct _TEST {
    int cbSize;
    // other members follow
} TEST, *PTEST;

そして、次のように使用します。

TEST t = { sizeof(TEST) };
...

また

TEST t;
t.cbSize = sizeof(TEST);
...

私の最初の推測では、これはバージョン管理に使用できる可能性があります。このような構造体へのポインタを受け取るcbSizeDLLは、DLLがコンパイルされたときに期待される値をメンバーが持っているかどうかを確認できます。または、構造体に対して適切なパッキングが行われているかどうかを確認します。しかし、私はあなたからここに行きたいと思います。

cbSizeWin32APIの一部のC++構造体のメンバーの目的は何ですか?

4

4 に答える 4

12

バージョン管理に使用されます。良い例はGetVersionEx呼び出しです。OSVERSIONINFOまたはOSVERSIONINFOEXのいずれかを渡すことができます。OSVERSIONINFOEX は OSVERSIONINFO のスーパーセットであり、渡されたものを OS が認識する唯一の方法は、dwOSVersionInfoSize メンバーによるものです。

于 2008-10-10T00:12:55.257 に答える
11

私の最初の推測では、これはバージョン管理に使用できる可能性があります。

それが1つの理由です。私はそれがより普通のものだと思います。

もう1つは、可変長データを持つ構造体用です。

発信者の正しいパッキングやバグをチェックすることがその背後にある特別な理由であるとは思いませんが、それはその効果があります。

于 2008-10-09T23:51:26.437 に答える
3

また、WIN32 APIは、渡されるデータに対して最小限のサニティ チェックを実行できます。

たとえば、よくある間違いは、WIN32構造体が誤ったまたは初期化されていない cbSizeで渡されること です。これが発生した場合、WIN32 APIは通常、破損したデータのように見えるものを処理しようとするのではなく、単に失敗した結果を返します。

于 2008-10-10T00:43:51.137 に答える
1

部分的にバージョニング、ほとんどの場合安全...呼び出された関数が、渡された構造体の一部ではないメモリに突っ込むのを防ぐため。

于 2008-10-09T23:56:44.993 に答える