CreateThread funktioniert nicht
-
Hallo
Ich will ein neues Thread erzeugen mit Hilfe von CreateThread()! Mein Quelltext wird Problemlos übersetzt aber wenn ich das Program ausführe wird die Funktion des Threads nicht ausgeführt und es erscheint eine Meldung das ein Fehler aufgetreten ist (.... Funktioniert nicht mehr! Es wird nach einer Lösung für das Problem gesucht!) Mein Code:#include "stdafx.h" #include "windows.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { HINSTANCE hDLL = LoadLibrary("...DLL.dll"); if(hDLL!=NULL){ cout << "DLL.dll geladen\n"; } FARPROC funktion = GetProcAddress(hDLL, "funktion"); if(funktion!=NULL){ cout << "Funktion geladen\n"; } /// Bis hierher funktionierts int i = 555; LPVOID p =&i; CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) funktion, p, 0, NULL); FreeLibrary(hDLL); system("Pause"); return 0; }Und die DLL:
#include <windows.h> #include <iostream> #include "DLL.h" using namespace std; BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: cout << "DLL_PROCESS_ATTACH"; break; case DLL_THREAD_ATTACH: cout << "DLL_THREAD_ATTACH"; break; case DLL_THREAD_DETACH: cout << "DLL_THREAD_DETACH"; break; case DLL_PROCESS_DETACH: cout << "DLL_PROCESS_DETACH"; break; } return TRUE; } EXPORT bool funktion(LPVOID i){ cout << i; return true; }EXPORT ist ein Makro und ist für c++ so definiert:
#define EXPORT extern "C" __declspec(dllexport)Wie kann ich LPVOID Variable einen int oder char wert zuweisen?
-
Errorcode?
Achja: http://www.c-plusplus.net/forum/viewforum-var-f-is-4.html
Wie kann ich LPVOID Variable einen int oder char wert zuweisen?
LPVOID ist ein void Zeiger, mit dem kannst du auf alles zeigen.
Wenn du viele Daten übergeben möchtest, würde es sich anbieten einen Zeiger auf eine Struktur mit Daten zu übergeben.
-
Kann es sein dass FreeLibrary dem Thread die Funktion unterm A*** wegreißt?
-
Also ich hab mit getlasterror() abfragen lassen und hab folgendes ausgegeben bekommen:
01244020
Wo kann ich nachschaun was das bedeutet? Bei Google hab ich nichts gefunden!
-
1. Warte bis der neu erzeugte Thread sich beendet hat bevor Du FreeLibrary(..) aufrufst. Das kannst Du z.B. mit WaitForSingleObject(..) tun.
2. CreateThread(..) gibt ein HANDLE auf den neuen Thread zurück. Das musst Du mit CloseHandle(..) schliessen, sobald Du es nicht mehr benötigst. Beachte, dass die Thread Funktion auch weiter ausgeführt wird, wenn bereits CloseHandle(..) aufgerufen wurde.
3. Die Signatur der Thread Funktion ist nicht korrekt, sie sollte wie folgt sein:
DWORD WINAPI myThreadFunc(LPVOID args);Der cast nach LPTHREAD_START_ROUTINE darf nicht mehr nötig sein! Der cast ist ein Fehler!
(Ev. kannst Du das so nicht exportieren, dann würde eine zwischen Funktion aushelfen.)4. GetLastError(..) hilft nur, wenn eine Funktion fehlschlägt; z.B. CreateThread(..) gibt NULL zurück, dann kannst Du mit GetLastError(..) mehr Info rausholen.
Die Error Codes können dann im VS unter Tools > Error Lookup nachgeschaut werden, oder natürlich online: http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx5. Lies Dir den Hinweis bezüglich CRT (C- Runtime) und CreateThread(..) bei der Doku zu CreateThread.
_beginthread(..) / _beginthreadex(..)6. Via dem LPVOID argument übergibt man dem Thread üblicherweise parameter für die Thread Funktion. Es einfach ein Zeiger, der durchgereicht wird. Achtung: Das Memory auf das er zeigt muss natürlich solange gültig sein, wie es in der Thread Funktion benötigt wird.
7. Generelle Frage:
Warum machst Du überhaupt ein Thread. Beim gezeigten Code macht das jedenfalls keinen Sinn. Ist das nur ein Test Programm / Forumscode oder die "richtige" Applikation?Hier noch die Doku zu CrateThread(..): http://msdn.microsoft.com/en-us/library/ms682453(VS.85).aspx
Simon