2008-10-09 10 views
7

Ich finde häufig einige Definitionen für Win32API-Strukturen (aber nicht darauf beschränkt), die ein cbSize Mitglied wie im folgenden Beispiel haben.Was ist der Zweck des CbSize-Members in Win32API-Strukturen

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

Und dann verwenden wir es so:

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

oder

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

Meine erste Vermutung ist, dass dies möglicherweise für die Versionierung verwendet werden könnten. Eine DLL, die einen Zeiger für eine Struktur wie folgt empfängt, kann überprüfen, ob das Mitglied cbSize den erwarteten Wert hat, mit dem die DLL kompiliert wurde. Oder um zu überprüfen, ob die Struktur richtig verpackt ist. Aber ich würde gerne von dir hier sein.

Was ist der Zweck des Elements cbSize in einigen C++ - Strukturen auf Win32API?

Antwort

10

Meine erste Vermutung ist, dass dies könnte möglicherweise für Versionierung verwendet werden.

Das ist ein Grund. Ich denke, es ist der üblichere.

Eine andere ist für Strukturen, die Daten mit variabler Länge haben.

Ich denke nicht, dass die Überprüfung auf korrekte Verpackung oder Fehler im Anrufer eine bestimmte Begründung dahinter sind, aber es hätte diesen Effekt.

0

Teilweise Versionierung, meist Sicherheit ... die genannte Funktion von Stossen in den Speicher zu verhindern, die nicht Teil der Struktur in vergangen war.

11

Es wird verwendet für die Versionierung. Ein gutes Beispiel ist der GetVersionEx Aufruf. Sie können entweder eine OSVERSIONINFO oder OSVERSIONINFOEX übergeben. Das OSVERSIONINFOEX ist eine Obermenge von OSVERSIONINFO, und die einzige Möglichkeit, die das OS weiß, die Sie übergeben haben, ist von dem DwOSVersionInfoSize-Mitglied.

+1

Stucts unterscheiden sich in der Größe zwischen OS-Versionen. Ich habe gerade einen Fehler unter Verwendung der Plattform sdk, die mit VC++ 2008 geliefert wird, gefunden. Wir haben die Betriebssystemversion nicht richtig definiert und am Ende die Vista-Version einer Struktur verwendet - was auf meiner XP-Box nicht so gut funktioniert hat. – Aardvark

2

Es ermöglicht auch der WIN32 API eine minimale Menge an Vernunft tun auf den Daten Check-in weitergegeben werden.

Zum Beispiel eines commom Fehler ist für eine WIN32 Struktur mit einem falsch übergeben werden oder uninitialisedcbSize und wenn dies die API WIN32 geschieht in der Regel gibt nur ein Ergebnis ausgefallen ist, anstatt zu versuchen, was zu verarbeiten scheint, Daten zu beschädigt.

Verwandte Themen