Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » DLL Threads

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
18.05.2005, 11:36 Uhr
~Thread-Frage
Gast


Hallo,

Ich habe folgende Thread-Problem. Ich möchte aus einer DLL heraus einen oder mehrere Threads starten. Also rufe ich CreateThread von DllMain aus auf. Wenn ich mir den Process im Taskmanager anschaue sehe ich, das ein Thread erzeugt wird, aber die Befehle der ThreadProc werden nicht abgearbeitet. Der gleiche Code funktioniert wenn ich damit eine Exe erzeuge(CreateThread dann in WinMain). Weiss jemand warum
das mit dem Thread bei der DLL nicht klappen will?

Ich poste hier jetzt mal die Code-Schnipsel, das sollte das ganze sicherlich erleichtern:


C++:
BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    if(ul_reason_for_call == DLL_PROCESS_ATTACH)
    {
        DWORD dwFlags;
        hThreadHandle = CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE) Log, NULL, dwFlags, NULL );
                 Steuerung();
    }
    else
    {
        ExitProcess(0);
        return FALSE;
    }
    return TRUE;
}



Und hier ist jetzt der Beginn der ThreadProc:



C++:
UINT Log(LPVOID pParam)
{
    MessageBox(NULL, "Thread gestartet" ,"Info", MB_ICONSTOP | MB_OK);



Die Messagebox habe ich noch nie zu sehen bekommen, der Rest der DLL(also die Procedure Steuerung()) läuft wie geplant. Wenn ich den gleichen Code in einer Exe benutze (also CreateThread dann unter WinMain) funktioniert er ohne Probleme.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.05.2005, 12:39 Uhr
Disi



Hallo,

vielleicht hilft dir das hier weiter

http://msdn.microsoft.com/library/DEU/vccore/html/_core_can_an_mfc_dll_create_multiple_threads.3f.asp
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.05.2005, 13:31 Uhr
~Thread
Gast



Zitat von Disi:
Hallo,

vielleicht hilft dir das hier weiter

http://msdn.microsoft.com/library/DEU/vccore/html/_core_can_an_mfc_dll_create_multiple_threads.3f.asp


Danke für die Antwort. Meine DLL benutzt aber nicht die MFC und ich arbeite nicht mit AFXBeginThread oder CWinThread. Also dürfte das doch auf dieses Problem gerade nicht zutreffen, wenn ich das richtig verstehe oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.05.2005, 15:26 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


schau mal ob hThreadHandle nach dem aufruf gültig ist und ruf ansonsten GetLastError auf und lass dir die Fehlermeldung mit FormatMessage ausgeben
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.05.2005, 16:11 Uhr
~Thread Frage
Gast



Zitat von FloSoft:
schau mal ob hThreadHandle nach dem aufruf gültig ist und ruf ansonsten GetLastError auf und lass dir die Fehlermeldung mit FormatMessage ausgeben


Danke für den Tip! Das werd ich jetzt gleich mal machen und dann das Ergebnis hier posten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.05.2005, 16:44 Uhr
~Thread-Frage
Gast


Ich hab mir jetzt mit GetLastError() und FormatMessage mal den Fehlercode geholt und geschaut ob ich ein gültiges Handle kriege. Das istd er Fall: GetLastError() liefert den Fehlercode 0 und das Handle ist auch gültig aber der Thread wird nicht abgearbeitet. Ich habe mich inzwischen soweit in das Thema eingelesen, das ich weiss, dass Threads nicht in DLLMain gestartet werden sollten. Threads die in DLLMain erzeugt werden, erzeugt das System zwar, hält sie aber gleichzeitig so lange an bis die Initialisierung der DLL abgeschlossen ist. Aber wie schliesse ich diese Initialisierung ab damit mein Thread anläuft? Habe jetzt schonmal folgendes probiert:


C++:
BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch(ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        {
        
            EntryPoint();
            break;
        }



und dann gehts weiter mit der Funktion EntryPoint:



C++:
void EntryPoint()
{
    DWORD dwFlags;
    hThreadHandle = CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE) &Log, NULL, dwFlags, NULL );
    Steuerung();
    return 1;
}



Damit vermeide ich es, den Thread direkt in DLLMain zu starten, das Ergebnis ist aber das selbe. Der Thread startet nicht , wird aber offenbar korrekt erzeugt(gültiges Handle, ErrorCode 0) aber wie es scheint weiter angehalten. Weiss jemand wie ich meine Threads zu laufen bringen kann?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.05.2005, 19:03 Uhr
Spacelord
Hoffnungsloser Fall


Wie bearbeitet deine DllMAin denn den Fall DLL_THREAD_ATTACH ?
Im ersten Beispiel weiter oben würdest du ja den Prozess beenden.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.05.2005, 19:17 Uhr
~Thread-Frage
Gast



Zitat von Spacelord:
Wie bearbeitet deine DllMAin denn den Fall DLL_THREAD_ATTACH ?
Im ersten Beispiel weiter oben würdest du ja den Prozess beenden.

MfG Spacelord


Ja das habe ich inzwischen auch schon gemerkt, das der Thread in der DLL nicht direkt an die ThreadProc geht, sondern auch erst wieder über DLLMain aufgerufen wird. Deshalb habe ich die DLLMain inzwischen so abgeändert:


C++:
BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch(ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        {
            EntryPoint();
            break;
        }
        case DLL_THREAD_ATTACH:
        {
            MessageBox(NULL, "THREAD_ATTACH","Thread", MB_ICONSTOP | MB_OK);
            break;
        }
        case DLL_THREAD_DETACH:
        {
            MessageBox(NULL, "THREAD_DETACH","Thread", MB_ICONSTOP | MB_OK);
            break;
        }
        case DLL_PROCESS_DETACH:
        {
            MessageBox(NULL, "PROCESS_DETACH","Thread", MB_ICONSTOP | MB_OK);
            ExitProcess(0);
            return FALSE;
        }
    }
    return TRUE;
}



Aber auch die MessageBox für den Fall THREAD_ATTACH habe ich noch nie zu sehen bekommen. Das scheint zu bedeuten, das der Thread garnicht erst anläuft. Weiss langsam echt nicht mehr was falsch ist
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
18.05.2005, 20:31 Uhr
Spacelord
Hoffnungsloser Fall


Die Frage ist ob zu diesem Zeitpunkt überhaupt schon die User32 Dll geladen ist!?
Vielleicht solltest du erstmal was einfacheres nehmen um zu Testen ob der Thread läuft.
Nen einfaches Trace oder so.
Das SDK sagt dass man in der DllMain keine user shell Com und Socketaufrufe machen sollte weil nicht sichergestellt ist das zu diesem Zeitpunkt schon alles geladen und initialisiert ist.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
18.05.2005, 21:21 Uhr
~Thread Frage
Gast



Zitat von Spacelord:
Die Frage ist ob zu diesem Zeitpunkt überhaupt schon die User32 Dll geladen ist!?
Vielleicht solltest du erstmal was einfacheres nehmen um zu Testen ob der Thread läuft.
Nen einfaches Trace oder so.
Das SDK sagt dass man in der DllMain keine user shell Com und Socketaufrufe machen sollte weil nicht sichergestellt ist das zu diesem Zeitpunkt schon alles geladen und initialisiert ist.

MfG Spacelord


Also MessageBox funktioniert schon in der DLLMain, das hatte ich vorher schon getestet. Wie kann ich denn die Initialisierung der DLL abschliessen? Reicht das schon wenn ich von DLLMain aus eine andere Funktion aufrufe(wie im beispiel oben EntryPoint). Wenn ich die DLLMain komplett abarbeiten lasse und mit return TRUE beende wird auch der Thread und damit der ganze Process beendet
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: