![]() |
Mehrere Instanzen + Parameterübergabe
Hey leute.
Habe folgenden Code aus dem Internet, nur verstehe ich nicht, wieso er nicht funktioniert (den code kann ich teilweise nachverfolgen)... QUELLCODE vom Programm:
Delphi-Quellcode:
und folgendes im Programm (Function -> procedure WndProc(var msg : TMessage); override;
var
mHandle: THandle; hWindow : DWORD; dwAtom : DWORD; begin dwMessage := RegisterWindowMessage('{93C5B2B7-CE8D-439A-857B-4CC76F35C091}'); // HIER z.B. wieso diese Zeichenfolge? mHandle:=CreateMutex(nil, True, 'WargasmSecure_Project'); if GetLastError <> ERROR_ALREADY_EXISTS then begin try Application.Initialize; Application.Title := 'Secure Password Storage'; Application.CreateForm(TForm_Main, Form_Main); Application.Run; finally if mHandle <> 0 then CloseHandle(mHandle); end; end else (*========== ELSE ==========*) begin hWindow := FindWindow(nil, 'WargasmSecure_Project'); if hWindow <> 0 then begin if (paramcount > 0) and FileExists(paramstr(1)) then begin //hier kommt er noch an... dwAtom := GlobalAddAtom(PChar(paramstr(1))); //okay, variablen "global" anlegen SendMessage(hWindow,dwMessage,0,dwAtom); // was genau wird hier übergeben ?? end; end; end; end. var ->dwMessage: DWORD;)
Delphi-Quellcode:
Dankbar für jede Hilfe...
procedure TForm_Main.WndProc(var msg : TMessage); //WNDPROC ? window procedure ?
var pFileName : PChar; dwLen : DWORD; begin if msg.Msg = dwMessage then begin //---> hier landet er erst gar nicht dwLen := MAX_PATH+1; pFileName := StrAlloc(dwLen); try GlobalGetAtomName(msg.lParam,pFileName,dwLen); if saveFirst() then begin if FileExists( pFileName ) then begin ME_Main.Lines.LoadFromFile(pFileName); ME_Main.Enabled := true; ToolBar_Main.Items.Items[0].Items[4].Enabled := true; ToolBar_Main.Items.Items[0].Items[5].Enabled := true; end; end; GlobalDeleteAtom(msg.lParam); finally StrDispose(pFileName); end; end else inherited WndProc(msg); end; |
Re: Mehrere Instanzen + Parameterübergabe
Wird deine gewünschte Funktion überhaupt aufgerufen?
Also kommt er wenigstens bis zur if-Abfrage? Bei mir war es so, dass ich das Event nicht zugeordnet hatte. Hatt sowas gebraucht:
Delphi-Quellcode:
( War so frei deinen Funktionsnamen da einzutragen )
Application.OnMessage := WndProc;
|
Re: Mehrere Instanzen + Parameterübergabe
Zitat:
eine interessante Frage an dieser Stelle ist natürlich, wo Du Dich bereits schlau gemacht hast. Hast Du Dir denn mal die Methoden angeschaut? Wonach gesucht, was gefunden?
Delphi-Quellcode:
Diese Zeichenkette ist eine UID (Unique ID). Diese Nummern werden i.d.R. im Zusammenhang mit COM verwendet, eine solche Nummer soll weltweit eindeutig sein. Sie wird auf eine bestimmte Art und Weise berechnet und setzt sich aus der IP-Adresse, Uhrzeit und ich glaube Seriennr von Windows zusammen. Eine solche Nummer kannst Du unter Delphi automatisch mittels STRG + ALT + G erzeugen.
dwMessage := RegisterWindowMessage('{93C5B2B7-CE8D-439A-857B-4CC76F35C091}'); // HIER z.B. wieso diese Zeichenfolge?
In diesem Fall wird die Nummer benötigt, da Du eine neue Nachricht erstellst und natürlich möchtest, dass nur Dein Programm auf diese Nachricht reagiert. Da dieser String weltweit einzigartig ist, kannst Du also davon ausgehen, dass sich nicht versehentlich ein anderes Programm für die Nachricht interessiert.
Delphi-Quellcode:
Was hier übergeben wird kannst Du im Windows-API nachlesen. Der erste Parameter ist das Handle, des Zielfensters. Der zweite gibt die ID der Nachricht an. Die beiden folgenden Parameter sind LParam und WParam, dass sind einfach Argumente, die Du übergeben möchtest. Der hier verwendete Typ kann für so ziemlich alles missbraucht werden. Das hier ein Atom verwendet wird, liegt am globalen Adressraum dieses Atom.
dwAtom := GlobalAddAtom(PChar(paramstr(1))); //okay, variablen "global" anlegen
SendMessage(hWindow,dwMessage,0,dwAtom); // was genau wird hier übergeben ??
Delphi-Quellcode:
Ist die Procedur, die für die Behandlung von Nachrichten zuständig ist. Hier geht es um die prinzipielle Arbeitsweise von Windows. Sehr vereinfacht funktionieren Programme unter Windows so, dass sie in einer Endlosschleife auf Nachrichten warten. Geht eine Nachricht ein, wird diese irgendwie verarbeitet (durch diese Prozedur in Delphi) und dann wird die nächste Nachricht entnommen.
procedure TForm_Main.WndProc(var msg : TMessage); //WNDPROC ? window procedure ?
Gruß Der Unwissende |
Re: Mehrere Instanzen + Parameterübergabe
Zitat:
DANKE EUCH BEIDEN! Also sie wird meines wissens aufgerufen (habs glaub ich mit showmessage mal getestet... ich denke durch das override passiert das. Ehm. Schade, dass ich jetzt net weiß, wieso es nicht funktioniert :( |
Re: Mehrere Instanzen + Parameterübergabe
Ich habe es jetzt mal ganz simpel gemacht: Das Programm soll sich selbst suchen und sich danach eine Message Senden:
Delphi-Quellcode:
wenn ich beim SENDMESSAGE als ersten PArameter handle (Form1.handle [sein eigenes Handle]) angebe, empfängt er die Nachricht und führt auch den if befehl aus... :(
procedure TForm1.Button2Click(Sender: TObject);
var wnd : HWND; begin wnd := FindWindow(nil, 'Project1'); //sucht seine eigene Instanz (und findet sich auch) if wnd <> 0 then begin SendMessage(wnd, 4245, 0, 0); // habe hier einfach mal die zahl "4225" genommen, ShowMessage('done...'); // da ich denke, dass dieser Parameter eine Art ID ist ?! end; end; procedure TForm1.wndproc(var Message:TMessage); begin if Message.msg = 4245 then // wenn die message ID.... begin edit1.Text := 'Yes'; // ....bescheid geben end else begin inherited; // ansonsten machen, was standardweise getan wird end; end; |
Re: Mehrere Instanzen + Parameterübergabe
Worin besteht jetzt noch das Problem?
Ich frage das, weil du das Topic immernoch als "offen" markiert hast. Sobald die Frage beantwortet wurde, ist unten ein entsprechender Link. ( unterhalb des "Antwort erstellen" Button) |
Re: Mehrere Instanzen + Parameterübergabe
Zitat:
Er findet das Fenster via
Delphi-Quellcode:
wnd := FindWindow(nil, Project2);
//und sendet die Message SendMessage(wnd, 12345, 0, 0); //zahl hier willkürlich |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz