Instanzensperrung + Daten austauschen
-
Ahoi zusammen,
Also ich habe folgendes Problem:Ich möchte verhindern, dass mein Programm zweimal ausgeführt werden kann! Allerdings soll bei einem 2. Aufruf der Befehlsparamter (LPSTR lpCmdLine) aus der WinMain dem bereits laufenden Programm übermittelt werden bevor sich die 2. Programminstanz schließt. (Ich hoffe das war jez verständlich
)Ich überprüfen durch den folgenden Code, ob mein Programm bereits ausgeführt wurde um es -wenn das der Fall war- dann zu beenden:
// in der WinMain // ... HANDLE hMutex; hMutext = OpenMutex(MUTEX_ALL_ACCESS, FALSE, TEXT("MeinProgramm")); if(hMutex == NULL) { hMutex = CreateMutex(MUTEX_ALL_ACCESS, FALSE, TEXT("MeinProgramm")); // => Das Programm läuft noch nicht: // ... } else { // => Das Programm läuft bereits: // ... return (0); // Programm beenden } ReleaseMutext(hMutex);Der Code funktioniert soweit.
Wie übermittle ich nun dem bereits laufendem Programm den Befehlsstring (lpCmdLine). Hab schon diverses probiert, aber funktioniert hat das alles nicht (richtig).
Hoffe aus hilfe
und Danke im voraus
-
Hallo, das kannst du mit SendMessage und WM_COPYDATA machen :
-
ersmal danke für antwort...
Aber da muss man meines Wissens die Daten (also den String) über GlobalAlloc reservieren (und den Pointer dann im lpData-Element sichern)...sowat hab ich so ähnlich schon versucht..und das hat nit gefunzt....weitere Ideen ?typedef struct tagCOPYDATASTRUCT { ULONG_PTR dwData; DWORD cbData; PVOID lpData; } COPYDATASTRUCT, *PCOPYDATASTRUCT;
-
Hat nicht vll einer von euch noch n kleinen Tipp, Hinweis, Codeschnipsle, was weiß ich....
???
-
wenn dein programm ein fenster hat dann mach das doch mit wm_copydata das is am einfachsten und genau für sowas gedacht. wenn du es unbedingt kompliziert machen willst kannste ja auch den command line string in die laufende programm instanz kopieren und das dem programm dann mit einer eigenen nachricht mitteilen aber ich würd einfach wm_copydata benutzen
if(!(hMutex = OpenMutex( MUTEX_ALL_ACCESS, FALSE, "LOLMUTEX?" ))) { hMutex = CreateMutex( NULL, FALSE, "LOLMUTEX?" ); } else { HWND hWnd = FindWindow( NULL, "LOLMutex" ); if( !hWnd ) return 0; DWORD dwProcessID; HANDLE hProcess; LPVOID lpMem; GetWindowThreadProcessId( hWnd, &dwProcessID ); hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwProcessID ); lpMem = VirtualAllocEx( hProcess, NULL, strlen(lpCmdLine) + 1, MEM_COMMIT, PAGE_READWRITE ); WriteProcessMemory( hProcess, lpMem, lpCmdLine, strlen(lpCmdLine) + 1, NULL ); CloseHandle(hProcess); SendMessage( hWnd, WM_CMDLINE, 0, (LPARAM)lpMem ); return 0; }
-
danke für deinen Code ich werd ihn nachher mal ausprobieren ... sieht gut aus

-
Hab nochmal ne Frage; kannst du mir mal die Funktion -> VirtualAllocEx <- erklären...hab die noch nie so richtig gecheckt...
Also mit GlobalAlloc kann man ja 'für alle Proggs' speicher reserv.
mit malloc(C), new(C++) bzw die ganzen WinAPI Paralellen LocalAlloc, etc. ...mit denen man im lokalen Heap speicher reserviert richtig??Ach ja wenn wir schonmal dabei sind wozu is dann HeapAlloc() ?

-
Mit VirtualAllocEx kannst du Speicher innerhalb eines fremden Prozesses allozieren. Der 1.Parameter ist das Handle zu dem jeweiligen Prozeß was du mit OpenProcess erhalten kannst.
Details findest du hier, dort werden auch die anderen Funktionen erklärt: http://msdn.microsoft.com/library/en-us/memory/base/virtualallocex.asp?frame=true
-
ok ok die Fkts hab ich jez gecheckt, aber ich muss den Speicher im Beispielcodefragment (schönes Wort^^) mit VirtualAllocEx auch wieder freigeben, jez meine Frage...: Welches Flag muss ich angeben: MEM_DECOMMIT oder MEM_RELEASE ? Ich versteh die Erklärungen inner MSDN irg wie nit janz...-> Danke für Hilfe

-
ok erledigt is klar: MEM_RELEASE