<?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[Frage zum Gültigeitsbereich eines HANDLES]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hätte eine Frage zu unten stehendem Quellcode. Und zwar geht es um das globale handle &quot;myGlobalHandle&quot;. In main rufe ich eine Funktion auf, in der ein neues Handle deklariert und initialisiert wird. Wenn die Initialisierung erfolgreich war, weise ich dieses neue handle dem globalen handle zu. Sonst passiert nichts in der Funktion.</p>
<p>Die Frage ist nun, ob ich in main nach dem erfolgreichen Durchlauf der Funktion &quot;assignGlobalHandle&quot; noch etwas damit machen kann? Eigentlich wird das handle doch nach dem Durchlauf der Funktion zerstört, oder? Steige da grad irgendwie nicht ganz durch...</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;windows.h&gt;

void assignGlobalHandle();

HANDLE myGlobalHandle; 

int main(void)
{
    assignGlobalHandle();

    //use myGlobalHandle for something

    return 0; 
}

void assignGlobalHandle(void)
{
    HANDLE myHandleInFunction = NULL;
    myHandleInFunction = CreateFile(TEXT(&quot;MyTEST:&quot;),
     				      (GENERIC_READ | GENERIC_WRITE),
 	    			      (FILE_SHARE_READ | FILE_SHARE_WRITE),
                           NULL, 0, 0, NULL);
    if(myHandleInFunction != NULL)
    {
        myGlobalHandle = myHandleInFunction; 
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/222013/frage-zum-gültigeitsbereich-eines-handles</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 19:54:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/222013.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 06 Sep 2008 13:39:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zum Gültigeitsbereich eines HANDLES on Sat, 06 Sep 2008 13:39:12 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hätte eine Frage zu unten stehendem Quellcode. Und zwar geht es um das globale handle &quot;myGlobalHandle&quot;. In main rufe ich eine Funktion auf, in der ein neues Handle deklariert und initialisiert wird. Wenn die Initialisierung erfolgreich war, weise ich dieses neue handle dem globalen handle zu. Sonst passiert nichts in der Funktion.</p>
<p>Die Frage ist nun, ob ich in main nach dem erfolgreichen Durchlauf der Funktion &quot;assignGlobalHandle&quot; noch etwas damit machen kann? Eigentlich wird das handle doch nach dem Durchlauf der Funktion zerstört, oder? Steige da grad irgendwie nicht ganz durch...</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;windows.h&gt;

void assignGlobalHandle();

HANDLE myGlobalHandle; 

int main(void)
{
    assignGlobalHandle();

    //use myGlobalHandle for something

    return 0; 
}

void assignGlobalHandle(void)
{
    HANDLE myHandleInFunction = NULL;
    myHandleInFunction = CreateFile(TEXT(&quot;MyTEST:&quot;),
     				      (GENERIC_READ | GENERIC_WRITE),
 	    			      (FILE_SHARE_READ | FILE_SHARE_WRITE),
                           NULL, 0, 0, NULL);
    if(myHandleInFunction != NULL)
    {
        myGlobalHandle = myHandleInFunction; 
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1577611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1577611</guid><dc:creator><![CDATA[Schniepi]]></dc:creator><pubDate>Sat, 06 Sep 2008 13:39:12 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Gültigeitsbereich eines HANDLES on Sat, 06 Sep 2008 14:31:41 GMT]]></title><description><![CDATA[<p>Schniepi schrieb:</p>
<blockquote>
<p>Die Frage ist nun, ob ich in main nach dem erfolgreichen Durchlauf der Funktion &quot;assignGlobalHandle&quot; noch etwas damit machen kann?</p>
</blockquote>
<p>Ja.</p>
<p>Schniepi schrieb:</p>
<blockquote>
<p>Eigentlich wird das handle doch nach dem Durchlauf der Funktion zerstört, oder?</p>
</blockquote>
<p>Wo wird hier ein Handle &quot;zerstört&quot;? Dies macht man mit &quot;CloseHandle&quot;, was ich bei Dir aber nicht finden kann...</p>
<p>PS: CreateFile liefert bei Fehler nicht &quot;NULL&quot; zurück, sondern &quot;INVALID_HANDLE_VALUE&quot;!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1577653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1577653</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Sat, 06 Sep 2008 14:31:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Gültigeitsbereich eines HANDLES on Sat, 06 Sep 2008 17:35:49 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke für die Antwort. Mein eigentlicher Gedanke war eben, dass ich dem handle myHandleInFunction innerhalb der Funktion irgend etwas zuweise. Und zwar einen Zeiger auf die Datei, die ich mit CreateFile erstellt habe.</p>
<p>Und da ich in der Funktion die Datei mit CloseFile o.ä. nicht mehr schließe, hätte ich gedacht dass die Datei auch verloren ist. Ich hätte angenommen dass das was ich mit der Datei in der Funktion evtl. noch gemacht hätte, verloren gewesen wäre.</p>
<p>Das globale handle &quot;myGlobalHandle&quot; ist ja letzten Endes nichts anderes ein void* Zeiger, d.h. der zeigt eben nur irgend wo hin wenn ich ihn den initialisiere. Und genau das mache ich ja in der Funktion. Ich sage, dass der Zeiger an die gleiche Stelle zeigen soll wie &quot;myHandleInFunction&quot;. Aber wenn die Funktion beendet wird, dann wird alles an Speicher was dort evtl. reserviert worden ist, wieder frei gegeben. D.h. ich hätte gedacht, dass nach dem Durchlauf der Funktion das globale handle natürlich noch auf die Adresse zeigt die ihm in der Funktion zugewiesen wurde, aber diese Adresse überhaupt nicht mehr die Werte enthalten muss die während dem Funktionsdurchlauf dort eingetragen wurden.</p>
<p>Hoffe ich konnte meine Schwierigkeiten ein bisschen präzisieren. Ist das was ich jetzt geschrieben habe totaler Bockmist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1577750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1577750</guid><dc:creator><![CDATA[Schniepi]]></dc:creator><pubDate>Sat, 06 Sep 2008 17:35:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Gültigeitsbereich eines HANDLES on Mon, 08 Sep 2008 05:46:56 GMT]]></title><description><![CDATA[<p>Bei Funktionsende werden nur die lokal angelegten Variablen zerstört. Auch ein in einer Funktion lokal angelegter Zeiger wird zerstört - es wird aber nicht zwangsläufig der Speicher freigegeben, auf den er zeigt.<br />
Das wäre nur der Fall, wenn er zB auf ein funktionslokales Array zeigen würde. In Deinem Fall zeigt er auf eine dynamisch angelegte Datenstruktur, die nicht auf dem Funktionsstack, sondern auf dem Heap existiert.<br />
Den Zeiger selbst hast Du ja durch Zuweisung an eine globale Variable 'gerettet'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578359</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 08 Sep 2008 05:46:56 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Gültigeitsbereich eines HANDLES on Mon, 08 Sep 2008 20:19:31 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>vielen Dankf für die Antwort. Dazu hätte ich nochmal eine Rückfrage. Es leuchtet mir ein, dass der zugewiesene Speicher erhalten bleibt, da er nicht auf dem Stack von der Funktion, sondern auf dem Heap reserviert wurde.</p>
<p>Angenommen ich würde die Adresse von dem reservierten Speicher nicht mit dem globalen handle &quot;retten&quot;, dass der Speicher dennoch reserviert bleiben würde? Oder wird er dann irgendwann mal nach einer Weile wieder frei gegeben, durch den garbage collector?</p>
<p>Einen ganz anderen Ansatz habe ich noch neulich in einem Buch gelesen, war zwar ein CE Buch aber das hat sich auch einleuchtend angehört. Und zwar stand dort, dass für jedes handle das ich einem bestimmten Speicherbereich zuweise, ein Zähler hochgezählt wird. Und erst, wenn ich jedes handle wieder geschlossen habe und der Zähler demzufolge null ist darf der Speicher wieder freigegeben werden. Passt das in meinem Beispiel nun auch?</p>
<p>Oder wie verhält es sich damit?</p>
<p>Auf jeden Fall vielen Dank nochmal für die Antwort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578877</guid><dc:creator><![CDATA[Schniepi]]></dc:creator><pubDate>Mon, 08 Sep 2008 20:19:31 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Gültigeitsbereich eines HANDLES on Mon, 08 Sep 2008 20:31:40 GMT]]></title><description><![CDATA[<p>ja. außerdem wird kein speicher alloziert sondern es wird ein handle returniert. ob das betriebssystem intern speicher alloziert und irgendwelche datenstrukturen anlegt, kann dir völlig latte sein. das was du im buch gelesen hast ist so aber du scheinst mir alles durcheinander zu würfeln. lies lieber ein buch zur gänze als von 5 stück die ersten 10 seiten...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578881</guid><dc:creator><![CDATA[asdca]]></dc:creator><pubDate>Mon, 08 Sep 2008 20:31:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Gültigeitsbereich eines HANDLES on Mon, 08 Sep 2008 22:26:00 GMT]]></title><description><![CDATA[<p>Schniepi schrieb:</p>
<blockquote>
<p>Angenommen ich würde die Adresse von dem reservierten Speicher nicht mit dem globalen handle &quot;retten&quot;, dass der Speicher dennoch reserviert bleiben würde? Oder wird er dann irgendwann mal nach einer Weile wieder frei gegeben, durch den garbage collector?</p>
</blockquote>
<p>In C, C++ gibt es keinen GarbageCollector, in C# schon, Du mußt also reservierten Speicher, bzw. anderweitige reservierte Ressourcen selbst freigeben.</p>
<p>Schniepi schrieb:</p>
<blockquote>
<p>Und zwar stand dort, dass für jedes handle das ich einem bestimmten Speicherbereich zuweise, ein Zähler hochgezählt wird. Und erst, wenn ich jedes handle wieder geschlossen habe und der Zähler demzufolge null ist darf der Speicher wieder freigegeben werden. Passt das in meinem Beispiel nun auch?</p>
<p>Oder wie verhält es sich damit?</p>
<p>Auf jeden Fall vielen Dank nochmal für die Antwort.</p>
</blockquote>
<p>Hier muß ich spekulieren:<br />
Das gilt nicht für Deine Zuweisung:<br />
myGlobalHandle = myHandleInFunction;<br />
Diese Zuweisung führt meiner Meinung nicht zu einer Referenzzählung. Das passiert nur bei Reproduktion des Handles via DuplicateHandle, Vererbung an Kindprozesse oder anderen, von OS-Routinen vorgenommenen Aktionen.<br />
In Deinem konkreten Fall heißt das, irgendwann CloseHandle(myGlobalHandle) und gut iss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578900</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 08 Sep 2008 22:26:00 GMT</pubDate></item></channel></rss>