Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mehrere Instanzen + Parameterübergabe (https://www.delphipraxis.net/90777-mehrere-instanzen-parameteruebergabe.html)

gregorkleiber 23. Apr 2007 17:00


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:
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.
und folgendes im Programm (Function -> procedure WndProc(var msg : TMessage); override;
var ->dwMessage: DWORD;)
Delphi-Quellcode:
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;
Dankbar für jede Hilfe...

DGS 23. Apr 2007 17:46

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:
  Application.OnMessage := WndProc;
( War so frei deinen Funktionsnamen da einzutragen )

Der_Unwissende 23. Apr 2007 18:55

Re: Mehrere Instanzen + Parameterübergabe
 
Zitat:

Zitat von gregorkleiber
Hey leute.
Habe folgenden Code aus dem Internet, nur verstehe ich nicht, wieso er nicht funktioniert (den code kann ich teilweise nachverfolgen)...

Hi,
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:
  dwMessage := RegisterWindowMessage('{93C5B2B7-CE8D-439A-857B-4CC76F35C091}'); // HIER z.B. wieso diese Zeichenfolge?
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.
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:
  dwAtom := GlobalAddAtom(PChar(paramstr(1))); //okay, variablen "global&quot; anlegen
  SendMessage(hWindow,dwMessage,0,dwAtom);    // was genau wird hier übergeben ??
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.

Delphi-Quellcode:
procedure TForm_Main.WndProc(var msg : TMessage); //WNDPROC ? window procedure ?
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.


Gruß Der Unwissende

gregorkleiber 23. Apr 2007 22:12

Re: Mehrere Instanzen + Parameterübergabe
 
Zitat:

Zitat von DGS
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:
  Application.OnMessage := WndProc;
( War so frei deinen Funktionsnamen da einzutragen )


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 :(

gregorkleiber 27. Apr 2007 13:04

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:
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;
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... :(

DGS 29. Apr 2007 10:08

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)

gregorkleiber 29. Apr 2007 10:15

Re: Mehrere Instanzen + Parameterübergabe
 
Zitat:

Zitat von DGS
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)

na weil se noch nicht beantwortet ist. abgesehen von einer Message an ALLE Programme funktioniert kein SendMessage (zB nur an mein 2. Programm) die frage ist, warum.
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 11:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz