Ich habe bemerkt, dass in c / c ++ vielen Win32-API-Strukturen gesagt werden muss, wie groß sie sind.
d. h. someStruct.pbFormat = sizeof(SomeStruct)
Warum ist das der Fall? Ist es nur aus Legacy-Gründen? Auch irgendeine Idee, wofür "pb" steht?
EDIT: oops, ja ich meinte "cbFormat"
Dies ist aus Gründen der Abwärtskompatibilität, wenn Windows-API erweitert wird.
Stellen Sie sich die folgenden Deklarationen vor
%Vor%was Sie so nennen:
%Vor%Eine zukünftige OS-Version kann dies auf
erweitern %Vor% Wenn Sie jedoch mit dem "älteren" SDK kompiliert haben, hat GetWinData
keine Chance herauszufinden, was Sie über extraData
nicht wissen. Wenn es unabhängig davon gefüllt würde, würden Daten auf dem Stapel überschrieben. BOOOM!
Aus diesem Grund wird die "dem Aufrufer bekannte Größe" zur Struktur hinzugefügt, und am Ende werden neue Elemente angehängt. Die GetWinData
-Implementierung kann die Größe überprüfen und entscheiden, dass "dieser arme Kerl noch nicht über alle neuen Funktionen Bescheid weiß".
Dies ist so, dass die Struktur in zukünftigen Versionen der API erweitert werden kann, und Windows kann dann (durch die Größe des Anrufers) wissen, welche Felder betrachtet werden sollen oder nicht. Es ist im Grunde eine grobe Form der API-Versionierung.
Normalerweise wird diesen Zählbytes das Präfix cb
vorangestellt, was für "Anzahl der Bytes" steht. Zum Beispiel beginnt die Struktur STARTUPINFO
mit:
Dies wurde irgendwann mit der STARTUPINFOEX
Struktur, die den gleichen ersten Teil aber eine andere Größe enthält. Abhängig vom Wert von cb
weiß Windows, ob das neue lpAttributeList
-Feld angezeigt werden soll oder nicht.
Der pb ist ein Beispiel für Ungarische Notation , im Grunde ein Schema zum Kodieren eines Variablentyps in seinen Namen.
p>Da die Win32-API eine C API ist - nicht C ++, sind objektorientierte Methoden zur Erweiterung der API nicht verfügbar. Mit der C ++ - API würde eine neue Funktion eine Struktur verwenden, die von der älteren abgeleitet ist, und eine Schnittstelle aufrufen, die die Basisstruktur übernimmt und die Typsicherheit gewährleistet.
C ist eine prozedurale Sprache und ist begrenzter in dem, was Sie mit Strukturen tun können.
So dass zukünftige Versionen zusätzliche Felder hinzufügen können und immer noch Rückwärts-Binärkompatibilität bieten können:
%Vor%