<?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[DLL_PROCESS_DETACH]]></title><description><![CDATA[<p>Hi,</p>
<p>ich will wenn meine DLL geladen wird einen Thread erzeugen.<br />
Dies mache ich in der Funktion DllMain</p>
<pre><code class="language-cpp">BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        	ubThreadExit = 0;
	ubThreadFinished = 0;
	hThread = CreateThread(NULL,0,&amp;USBRead,0,0,&amp;ThreadId);
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;

    case DLL_PROCESS_DETACH:
	if (hThread)
	{
	   //cancel Rx Thread
	   ubThreadExit = 1;
	   while(!ubThreadFinished) 
	   {
              Sleep(10);
            }
	}
        break;
    default:
        break;
    }
}
</code></pre>
<p>Jetzt habe ich das Problem wenn ich in den Prozess beenden will das dieser schon gar nicht mehr existiert aber das Handle noch gültig ist.</p>
<p>Wo wird dieser Thread beendet wenn er nicht mehr da ist bei DLL_PROCESS_DETACH?</p>
<p>Achso hier noch der Code des Threads:</p>
<pre><code class="language-cpp">while(!ubThreadExit)
	{
		Sleep(10);
	}
	ubThreadFinished = 1;

	return(0);
}
</code></pre>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/183559/dll_process_detach</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 00:54:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/183559.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 06 Jun 2007 08:39:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to DLL_PROCESS_DETACH on Fri, 25 Oct 2013 09:24:28 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich will wenn meine DLL geladen wird einen Thread erzeugen.<br />
Dies mache ich in der Funktion DllMain</p>
<pre><code class="language-cpp">BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        	ubThreadExit = 0;
	ubThreadFinished = 0;
	hThread = CreateThread(NULL,0,&amp;USBRead,0,0,&amp;ThreadId);
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;

    case DLL_PROCESS_DETACH:
	if (hThread)
	{
	   //cancel Rx Thread
	   ubThreadExit = 1;
	   while(!ubThreadFinished) 
	   {
              Sleep(10);
            }
	}
        break;
    default:
        break;
    }
}
</code></pre>
<p>Jetzt habe ich das Problem wenn ich in den Prozess beenden will das dieser schon gar nicht mehr existiert aber das Handle noch gültig ist.</p>
<p>Wo wird dieser Thread beendet wenn er nicht mehr da ist bei DLL_PROCESS_DETACH?</p>
<p>Achso hier noch der Code des Threads:</p>
<pre><code class="language-cpp">while(!ubThreadExit)
	{
		Sleep(10);
	}
	ubThreadFinished = 1;

	return(0);
}
</code></pre>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299795</guid><dc:creator><![CDATA[maikhaenig]]></dc:creator><pubDate>Fri, 25 Oct 2013 09:24:28 GMT</pubDate></item><item><title><![CDATA[Reply to DLL_PROCESS_DETACH on Wed, 06 Jun 2007 08:46:06 GMT]]></title><description><![CDATA[<p>Das geht nicht.<br />
BTW musst Du damit rechnen, dass der Therad nicht sofort gestartet wird. Das Problem ist, dass DllMain nur immer von einem Thread benutzt werden darf. Der Thread Start würde aber einen neuen DllMain Aufruf erzwingen.</p>
<p>Grundsätzlich gilt: Das Erzeugen von Threads und viele andere Funktionen haben in DllMain nichts zu suchen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299805</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 06 Jun 2007 08:46:06 GMT</pubDate></item><item><title><![CDATA[Reply to DLL_PROCESS_DETACH on Fri, 25 Oct 2013 09:24:45 GMT]]></title><description><![CDATA[<p>also mit dem erzeugen habe ich kein Problem das klappt und der Thread wir auch sofort gestartet er wird halt wie gesagt schon vorher beendet bevor er die DllMain mit PROCESS_DETACH aufruft.</p>
<p>Ich würde gerne nachdem ich das while meines threads verlassen habe noch ein paar anweisungen machen zu aufräumen und wenn der einfach so weg ist, weiß ich ja nicht ob die gemacht wurden oder nicht.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299817</guid><dc:creator><![CDATA[maikhaenig]]></dc:creator><pubDate>Fri, 25 Oct 2013 09:24:45 GMT</pubDate></item><item><title><![CDATA[Reply to DLL_PROCESS_DETACH on Wed, 06 Jun 2007 09:02:52 GMT]]></title><description><![CDATA[<p>Du kannst in DllMain auch nicht auf das Beenden des Threads warten.<br />
Das einzige was du tun kannst ist checken dass er wirklich schon weg ist, und dann das Handle freigeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299829</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 06 Jun 2007 09:02:52 GMT</pubDate></item><item><title><![CDATA[Reply to DLL_PROCESS_DETACH on Fri, 25 Oct 2013 09:24:59 GMT]]></title><description><![CDATA[<p>alos genau das ist ja das Problem der Thread wird einfach zerstört wodurch die tread beendet Variable aber nicht gesetzt wird. Dadurch hängt der sich dann in der Schleife auf.</p>
<p>Wie kann man das denn dann anders machen? Ich möchte einen Tread in meiner Dll laufen haben ohne das ich erst eine Funktionen in meiner DLL vom Typ Init und Exit die jeweils den Thread starten oder beenden.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299837</guid><dc:creator><![CDATA[maikhaenig]]></dc:creator><pubDate>Fri, 25 Oct 2013 09:24:59 GMT</pubDate></item><item><title><![CDATA[Reply to DLL_PROCESS_DETACH on Wed, 06 Jun 2007 10:15:19 GMT]]></title><description><![CDATA[<p>Wie schon gesagt wurde.<br />
Du kannst den Thread starten aber der Thread läuft nicht an, weil Du DllMain blockierst!</p>
<p>Wenn es Dir egal ist wann der Thread beendet dann kannst Du es machen.<br />
Grundsätzlich: Man kann in DllMain nicht auf Threads oder Ereignisse warten, die den Threads des eigenen Prozesses betreffen!<br />
Oder man sollte es tunlichst nicht tun, da man einen deadlock bekommt!</p>
<p>Darum herum gibt es keine Lösung!<br />
Bau eine Init Funktion <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299896</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 06 Jun 2007 10:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to DLL_PROCESS_DETACH on Fri, 25 Oct 2013 09:25:14 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>also der Thread läuft an. Er bekommt auch Rechenzeit.<br />
Ich blokiere die DllMain ja erst beim beenden. Und da ist auch meine eigentliche frage: Warum mein Thread da schon aus ist (laut Process Explorer)?</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299903</guid><dc:creator><![CDATA[maikhaenig]]></dc:creator><pubDate>Fri, 25 Oct 2013 09:25:14 GMT</pubDate></item><item><title><![CDATA[Reply to DLL_PROCESS_DETACH on Wed, 06 Jun 2007 10:49:36 GMT]]></title><description><![CDATA[<p>Wo wird denn Dein &quot;hThread&quot; gelöscht??? Der Thread macht dies nicht automatisch!<br />
Das beste ist einfach mittels WaitForSingleObject auf das Handle zu warten. Dies wird dann signalisiert, wenn der Thread beendet ist.<br />
Dies sollte man natürlich nie aus DllMain machen, da Du hier ja den Loader-Lock hälst und dies dann zu sehr &quot;komischen&quot; nebeneffekten und hängern führen kann...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299921</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Wed, 06 Jun 2007 10:49:36 GMT</pubDate></item><item><title><![CDATA[Reply to DLL_PROCESS_DETACH on Fri, 25 Oct 2013 09:25:27 GMT]]></title><description><![CDATA[<p>das wüßte ich ja auch gern wie oder wo mein thread gelöscht wird.</p>
<p>Wenn ich einen Breakpoint auf das if bei DLL_PROCESS_DETACH setze und dann in den Prozess Explorer kuck ist dieser Prozeß nicht da. Dann brauch ich mich ja nicht wundern wenn der nicht mehr aus der while schleife kommt.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299925</guid><dc:creator><![CDATA[maikhaenig]]></dc:creator><pubDate>Fri, 25 Oct 2013 09:25:27 GMT</pubDate></item><item><title><![CDATA[Reply to DLL_PROCESS_DETACH on Wed, 06 Jun 2007 11:00:00 GMT]]></title><description><![CDATA[<p>Ich dachte erst dein Thread wird vorher sauber beendet.<br />
Wenn er das nicht wird, dann wird vermutlich einfach irgendwo ::ExitProcess aufgerufen, und das tötet alle Threads.</p>
<p>Und bei DLL_PROCESS_DETACH sind natürlich schon alle Threads futsch, das sollte klar sein (ausser die DLL wurde dynamisch geladen und vor Ende des Programms wieder freigegeben).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299929</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 06 Jun 2007 11:00:00 GMT</pubDate></item><item><title><![CDATA[Reply to DLL_PROCESS_DETACH on Fri, 25 Oct 2013 09:25:42 GMT]]></title><description><![CDATA[<p>also wenn die DllMain mit DLL_PROCESS_DETACH aufgerufen wird heißt das die Dll wurde durch FreeLibrary beendet oder wenn man die DLL über die Lib eingebunden hast wurde dieses Programm beendet was ebenfalls die Dll beendet.<br />
Alle Threads der Dll sind damit auch gekillt worden.</p>
<p>Verstehe ich das so richtig?</p>
<p>Das würde ja heißen das diese Nachicht DLL_PROCESS_DETACH eigentlich zu nix mehr nütze ist.</p>
<p>Dann ist natürlich die Frage wie ich meinen Thread sauber beenden kann ohne das ich eine Funjtion Exit in die Dll einbaue.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299949</guid><dc:creator><![CDATA[maikhaenig]]></dc:creator><pubDate>Fri, 25 Oct 2013 09:25:42 GMT</pubDate></item><item><title><![CDATA[Reply to DLL_PROCESS_DETACH on Wed, 06 Jun 2007 11:38:55 GMT]]></title><description><![CDATA[<p>Ja! Die Doku hierzu ist doch eindeutig:</p>
<p>When a DLL is unloaded from a process as a result of an unsuccessful load of the DLL, termination of the process, or a call to FreeLibrary, the system does not call the DLL's entry-point function with the DLL_THREAD_DETACH value for the individual threads of the process. The DLL is only sent a DLL_PROCESS_DETACH notification. DLLs can take this opportunity to clean up all resources for all threads known to the DLL.</p>
<p>If you terminate a process by calling TerminateProcess or TerminateJobObject, the DLLs of that process do not receive DLL_PROCESS_DETACH notifications. If you terminate a thread by calling TerminateThread, the DLLs of that thread do not receive DLL_THREAD_DETACH notifications.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299951</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 06 Jun 2007 11:38:55 GMT</pubDate></item><item><title><![CDATA[Reply to DLL_PROCESS_DETACH on Fri, 25 Oct 2013 09:25:58 GMT]]></title><description><![CDATA[<p>Also wenn die meldung kommt sind alle Threads schon gekillt.</p>
<p>Dann muß ich mir wohl doch ne Exit Funktion bauen welche den Thread sauber beendet.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299960</guid><dc:creator><![CDATA[maikhaenig]]></dc:creator><pubDate>Fri, 25 Oct 2013 09:25:58 GMT</pubDate></item></channel></rss>