AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrere Instanzen + Parameterübergabe

Ein Thema von gregorkleiber · begonnen am 23. Apr 2007 · letzter Beitrag vom 29. Apr 2007
Antwort Antwort
gregorkleiber
(Gast)

n/a Beiträge
 
#1

Mehrere Instanzen + Parameterübergabe

  Alt 23. Apr 2007, 17:00
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...
  Mit Zitat antworten Zitat
DGS

Registriert seit: 10. Jul 2004
65 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Mehrere Instanzen + Parameterübergabe

  Alt 23. Apr 2007, 17:46
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:
  Application.OnMessage := WndProc; ( War so frei deinen Funktionsnamen da einzutragen )
Vorschläge für sinnvolle Signatur bitter per PN
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#3

Re: Mehrere Instanzen + Parameterübergabe

  Alt 23. Apr 2007, 18:55
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?

  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.

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
  Mit Zitat antworten Zitat
gregorkleiber
(Gast)

n/a Beiträge
 
#4

Re: Mehrere Instanzen + Parameterübergabe

  Alt 23. Apr 2007, 22:12
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:
  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
  Mit Zitat antworten Zitat
gregorkleiber
(Gast)

n/a Beiträge
 
#5

Re: Mehrere Instanzen + Parameterübergabe

  Alt 27. Apr 2007, 13:04
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...
  Mit Zitat antworten Zitat
DGS

Registriert seit: 10. Jul 2004
65 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: Mehrere Instanzen + Parameterübergabe

  Alt 29. Apr 2007, 10:08
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)
Vorschläge für sinnvolle Signatur bitter per PN
  Mit Zitat antworten Zitat
gregorkleiber
(Gast)

n/a Beiträge
 
#7

Re: Mehrere Instanzen + Parameterübergabe

  Alt 29. Apr 2007, 10:15
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:08 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