代码之家  ›  专栏  ›  技术社区  ›  Jorge Ferreira

win32api结构中cbsize成员的用途是什么

  •  7
  • Jorge Ferreira  · 技术社区  · 16 年前

    我经常遇到一些win32api结构的定义(但不限于此),它们具有 cbSize 成员,如下面的示例中所示。

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

    然后我们这样使用它:

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

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

    我最初的猜测是,这可能用于版本控制。接收此类结构的指针的dll可以检查 CBSIZE 成员具有编译dll所用的预期值。或者检查结构是否进行了适当的包装。但我想从你这里来。

    目的是什么 CBSIZE 在Win32 API上的一些C++结构中的成员?

    4 回复  |  直到 13 年前
        1
  •  10
  •   Michael Burr    16 年前

    我最初的猜测是 可能用于版本控制。

    这是一个原因。我觉得这是比较平常的一个。

    另一种是用于具有可变长度数据的结构。

    我不认为在调用者中检查正确的包装或错误是背后的一个特殊的推理,但它会有这样的效果。

        2
  •  11
  •   Rob Walker    16 年前

    它用于版本控制。一个很好的例子是 GetVersionEx 打电话。你可以通过 OSVERSIONINFO OSVERSIONINFOEX . OSVersionInfoEx是OSVersionInfo的一个超集,而操作系统知道您传递了哪些信息的唯一方法是由dwosVersionInfoSize成员传递。

        3
  •  2
  •   jussij    16 年前

    它也让 Win32 API 对传入的数据进行最小程度的健全性检查。

    例如,一个常见的错误是 Win32 要传入的结构 不正确的 未初始化的 CBSIZE 当这种情况发生时, Win32 API 通常只返回一个失败的结果,而不是尝试处理似乎已损坏的数据。

        4
  •  0
  •   Hafthor    16 年前

    部分版本控制,主要是安全性…以防止被调用函数戳入不是传入结构的一部分的内存。