<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Wieso haben so viele Windows-Strukturen eine Variable, die ihre eigene Größe beinhaltet?]]></title><description><![CDATA[<p>Am Beispiel der WNDCLASSEX-Struktur:</p>
<pre><code>typedef struct {
    UINT cbSize;
    UINT style;
    WNDPROC lpfnWndProc;
    int cbClsExtra;
    int cbWndExtra;
    HINSTANCE hInstance;
    HICON hIcon;
    HCURSOR hCursor;
    HBRUSH hbrBackground;
    LPCTSTR lpszMenuName;
    LPCTSTR lpszClassName;
    HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
</code></pre>
<p><strong>cbSize</strong><br />
Specifies the size, in bytes, of this structure. Set this member to sizeof(WNDCLASSEX). Be sure to set this member before calling the GetClassInfoEx function.</p>
<p>Und so ist das bei verdammt vielen Windows-Geschichten. Wieso muss in der Struktur die eigene Größe gespeichert sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/210011/wieso-haben-so-viele-windows-strukturen-eine-variable-die-ihre-eigene-größe-beinhaltet</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Apr 2026 04:54:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/210011.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 06 Apr 2008 03:18:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wieso haben so viele Windows-Strukturen eine Variable, die ihre eigene Größe beinhaltet? on Sun, 06 Apr 2008 03:18:12 GMT]]></title><description><![CDATA[<p>Am Beispiel der WNDCLASSEX-Struktur:</p>
<pre><code>typedef struct {
    UINT cbSize;
    UINT style;
    WNDPROC lpfnWndProc;
    int cbClsExtra;
    int cbWndExtra;
    HINSTANCE hInstance;
    HICON hIcon;
    HCURSOR hCursor;
    HBRUSH hbrBackground;
    LPCTSTR lpszMenuName;
    LPCTSTR lpszClassName;
    HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
</code></pre>
<p><strong>cbSize</strong><br />
Specifies the size, in bytes, of this structure. Set this member to sizeof(WNDCLASSEX). Be sure to set this member before calling the GetClassInfoEx function.</p>
<p>Und so ist das bei verdammt vielen Windows-Geschichten. Wieso muss in der Struktur die eigene Größe gespeichert sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1487234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1487234</guid><dc:creator><![CDATA[JustAnotherBeginner]]></dc:creator><pubDate>Sun, 06 Apr 2008 03:18:12 GMT</pubDate></item><item><title><![CDATA[Reply to Wieso haben so viele Windows-Strukturen eine Variable, die ihre eigene Größe beinhaltet? on Sun, 06 Apr 2008 07:24:05 GMT]]></title><description><![CDATA[<p>Falls man in einer späteren Windows-Version die Funktionalität einer API-Funktion<br />
erweitern will, kann man das ganz einfach machen ohne das API zu ändern.</p>
<p>Die API-Funktion brauch nur die Größe der Struktur prüfen und weis automatisch<br />
was extra noch in der Struktur steht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1487243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1487243</guid><dc:creator><![CDATA[AZ]]></dc:creator><pubDate>Sun, 06 Apr 2008 07:24:05 GMT</pubDate></item><item><title><![CDATA[Reply to Wieso haben so viele Windows-Strukturen eine Variable, die ihre eigene Größe beinhaltet? on Sun, 06 Apr 2008 08:06:37 GMT]]></title><description><![CDATA[<p>Und noch ein kleiner Zusatz: Es ist auch eine Art Sicherheitsmechanismus, damit man nicht die falsche Struktur übergibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1487247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1487247</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 06 Apr 2008 08:06:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wieso haben so viele Windows-Strukturen eine Variable, die ihre eigene Größe beinhaltet? on Sun, 06 Apr 2008 13:29:09 GMT]]></title><description><![CDATA[<p>Verstehe ich nicht. Windows könnte die Größe der Struktur doch auch so überprüfen, ohne dass er in der Struktur gespeichert wird, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1487377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1487377</guid><dc:creator><![CDATA[JustAnotherBeginner]]></dc:creator><pubDate>Sun, 06 Apr 2008 13:29:09 GMT</pubDate></item><item><title><![CDATA[Reply to Wieso haben so viele Windows-Strukturen eine Variable, die ihre eigene Größe beinhaltet? on Sun, 06 Apr 2008 13:49:34 GMT]]></title><description><![CDATA[<p>Ne, wie denn? Es bekommt ja einfach nur einen Zeiger übergeben.</p>
<p>Wenn du eine Windows-Funktion wärst, könntest du ja z.B. so aussehen:</p>
<pre><code class="language-cpp">struct CIRCLE
{
    uint size;
    ....
};

void DrawCircle( CIRCLE* circle )
{
}
</code></pre>
<p>Innerhalb der Draw-Circle-Funktion hast du keine Möglichkeit zu prüfen, ob der Speicher hinter dem Parameter &quot;circle&quot; auch die Größe der Struktur &quot;CIRCLE&quot; hat. Der naive Ansatz <code>if ( sizeof(*circle) == sizeof(CIRCLE) )</code> wird nicht funktionieren, da das der Compiler prüft; dieser weiß zum Zeitpunkt des Kompilierens nur, dass &quot;circle&quot; ein Zeiger auf die Struktur &quot;CIRCLE&quot; ist und gibt für <code>sizeof(*circle)</code> deshalb immer dasselbe an wie <code>sizeof(CIRCLE)</code> .</p>
<p>Durch die Überprüfung mit</p>
<pre><code class="language-cpp">void DrawCircle( CIRCLE* circle )
{
    if ( circle-&gt;size == sizeof(CIRCLE) )
        ;// alles ok
}
</code></pre>
<p>kannst du aber auch nicht 100% wissen, ob die richtige Struktur übergeben wurde, du bekommst ja nur eine Adresse übergeben und prüfst, ob der erste &quot;uint&quot; hinter dieser Adresse den Wert <code>sizeof(CIRCLE)</code> hat.<br />
Du könntest ein wenig tricksen und das ganze so umgehen:</p>
<pre><code class="language-cpp">// Von hier wird die Funktion DrawCircle aufgerufen
struct MyOwnStruct
{
    uint bla;
    ...
};
MyOwnStruct tricky;
tricky.bla = sizeof(CIRCLE);
DrawCircle( reinterpret_cast&lt;CIRCLE*&gt;( &amp;tricky ) );
</code></pre>
<p>Hier stimmt alles aus der Sicht von &quot;DrawCircle&quot;, es bekommt einen Zeiger übergeben und der erste Wert hinter dem Zeiger stimmt mit <code>sizeof(CIRCLE)</code> überein. Man kann es sogar noch einfacher umgehen: <code>uint a=sizeof(CIRCLE); DrawCircle( reinterpret_cast&lt;CIRCLE*&gt;( &amp;a ) );</code> .</p>
<p>Windows hat selbst mit diesem Mechanismus also keine Möglichkeit, <em>sicher</em>zugehen, dass ein Zeiger mit validem Hintergrund übergeben wurde. Aber es ist besser als nichts und zu guter Letzt ist die &quot;size&quot;-Information auch wichtig, wenn man die Struktur erweitert, size &quot;AZ&quot;s Post.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1487386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1487386</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 06 Apr 2008 13:49:34 GMT</pubDate></item></channel></rss>