WM_USER und Übergabeparameter
-
Ich habe ein Progg geschrieben, dass beim Start über einen Mutex überprüft, ob das Progg schonmal vorhanden ist. Ist dies der Fall, liest es eine eventuell übergebende Kommandozeile der 2.Instanz aus und schickt sie per WM_USER-Message an die zuerst gestartete Applikation zur Weiterverarbeitung. Dann beendet sich die 2.Instanz des Programmes von selbst (denn nur das die 1.Instanz soll laufgen und aktiv bleiben !). Ziemlich schwierig aber vielleicht versteht man es anhand des Codes besser:
#include <windows.h> #include "resource.h" #define WM_COMMANDLINE (WM_USER+1) HANDLE hmutex; int index; BOOL CALLBACK DialogProzedur (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hwindow=NULL; MessageBox(NULL,szCmdLine,"szCmdLine",0); hmutex=CreateMutex(NULL,FALSE,"MeinProgramm"); if(hmutex==NULL) MessageBox(NULL,"FEHLER ! CreateMutex gescheitert !","Fehler",MB_OK | MB_ICONERROR); else if(GetLastError()==ERROR_ALREADY_EXISTS) { hwindow=FindWindow(NULL,"Dialog"); if(strcmp(szCmdLine,"")!=0) { SendMessage(hwindow,WM_COMMANDLINE,0,(long)szCmdLine); } return -1; } return DialogBox(hInstance,MAKEINTRESOURCE(DIALOG1), NULL, DialogProzedur); } BOOL CALLBACK DialogProzedur (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_INITDIALOG: return true; case WM_COMMANDLINE: MessageBox(NULL,(char*)lParam,"lParam in WM_COMMANDLINE:",0); return true; ...
Das Problem, dieses Programm funktioniert unter NT-Plattformen nicht richtig. Es prüft zwar die Instanz und beendet das eigene Programm und löst die WM_COMMANDLINE-Message bei der 1.Instanz aus, jedoch ist der Text in der MessageBox nicht der, der mit der Commandline an die 2.Instanz übergeben wurde.
Angenommen ich starte per Commandozeile: "MeinProgramm.exe /Test der erste"
und die 1.Instanz ist bereits aktiv, dann krieg ich nach Auswertung der WM_COMMANDLINE-Message der 1.Instanz die MessageBox mit dem Programm-Pfad als Text, warum aber nicht "/Test der erste" ?
Etwas komisch, oder ?[ Dieser Beitrag wurde am 24.02.2003 um 18:27 Uhr von BiGFusel editiert. ]
-
WM_COPYDATA
Der String befindet sich doch garnicht im Speicher vom anderen Prozess und dann zeigt der auf was ganz anderes.
-
Und was könnte / sollte ich tun ?
-
WM_COPYDATA benutzen
-
nein. google?
-
Haste auch ein Beispiel ?
-
Es ist aber verwunderlich, dass der Programm-Pfad trotzdem ankommt
-
Das versteh ich eben auch nicht ganz, unter Win98SE funktioniert es sogar richtig, das heisst in der MessageBox steht auch die Kommandozeilenoption drin !
-
Gib doch vor SendMessage den String mal aus und schau, was da drin steht (bei Win2K)
-
Habe ich ja schoin gemacht, steht die richtige Kommandozeile drin.
-
über WM_COPYDATA funktionierts !!!
-
geil
-
find ich auch