Globale variablen
-
Naja man hat ja beim GUI 2 Funktionen...
int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow)
und
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
Habe Globale Variablen gemacht wie auch sonst bei Consolen Programmen
also vor
int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow)
Nun ist aber das Problem das ich bei einem Click auf einem Button ein Prozess erstelle mittels CreateProcess. Die PROCESS_INFORMATION variable bzw Struktur
die ich dabei benutze ist Global, wenn ich aber probiere die variable jetzt zb in einem Thread zu benutzen, hat die PROCESS_INFORMATION variable nicht die Daten von CreateProcess, nur in der Funktion LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam). In der wurde ja auch CreateProcess aufgerufen...
Also wie mach ich das das die Globalen Variablen auch die werte bzw daten die diese in anderen Funktion erhalten haben auch in einem Thread etc haben.Vielen dank im vorraus, ich weiss ist ein bisl doof erklärt aber hoffe ihr versteht was ich meine.
-
Bin nicht sicher, ob ich dich richtig verstanden habe, aber...
Wenn du eine globale Variable hast, hat sie immer einen Wert, das ist in allen Funktionen der ÜE gleich, Threadfunktionen machen da keine Ausnahme. Ist dein Problem vielleicht eher die Abfolge? Wahrscheinlich wird der Thread gestartet, bevor die Funktion ausgeführt ist, die deine Globale befüllt. In dem Fall musst du einfach nur die Reihenfolge korrigieren oder eine Bedingung einbauen (Thread pausiert, bis die Variable einen gültigen Wert hat).
Am besten, du erklärst nochmal genauer oder zeigst ein wenig Code.
EDIT: Nach nochmaligem Lesen deines Posts denke ich, dass du vielleicht einfach eine lokale Variable mit dem gleichen Namen definiert hast und mit Werten füllst. Zeig mal Code!
-
Nein ich habe natürlich nicht noch eine Lokale Variable.
So wie ich dich verstanden habe, mit dem Thread später starten....
Meinst du das ich den Thread Parameter geben soll ?Also PROCCESS_INFORMATION im den parametern und dann beim Start des Threads
die globale Variable an den Thread übergeben soll ? (hoffentlich KEIN muss)Zu dem Code, du kannst es dir ungefähr so vorstellen:
void funktion(); void __cdecl thread(void *); PROCCESS_INFORMATION pi; int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) { // Code } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { // Code _beginthread(thread, 0, NULL); // Bei button click Funktion() aufruf } void funktion() { // Code..... CreateProcess(NULL, path, NULL, NULL, NULL, CREATE_SUSPENDED, NULL, NULL, &si, &pi); } void __cdecl thread(void *) { // Code WriteProcessMemory(pi.hProcess, (void*)0x123456, &bytes , 5, new DWORD); // DH WPM soll die globale variable pi benutzen }Jetzt sollte man verstehen was ich meine :p
-
Ok, ich vermute, es passiert in dieser Reihenfolge:
- pi wird deklariert
- der Thread 'thread' wird gestartet und benötigt Werte von pi
- in einem Click-Event-Handler wird pi mit Werten gefülltRichtig? Wenn du nicht sicher bist, setze einfach ein paar Breakpoints. Wenn es so passiert, ist der Fall ja klar. Du willst auf die Member von pi zugreifen, bevor du ihnen überhaupt Werte zuweist, und das geht dann verständlicherweise schief.
Interessant wäre halt noch, in welchem Kontext du deine Thread-Funktion startest. Dann könnte man eher Rückschlüsse ziehen, ob die Abarbeitungsreihenfolge stimmt oder nicht (WM_INITDIALOG wäre z.B. denkbar ungünstig). Aber das findest du sicher gleich raus.