AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi WM_COPYDATA macht große Probleme
Thema durchsuchen
Ansicht
Themen-Optionen

WM_COPYDATA macht große Probleme

Ein Thema von Mazel · begonnen am 17. Jul 2006 · letzter Beitrag vom 19. Jul 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#1

WM_COPYDATA macht große Probleme

  Alt 17. Jul 2006, 14:31
Hallo,

ich möchte von einem Programm zu einem anderen eine Nachricht senden, doch das funktoniert nicht.

Hier mal mein Code:
Delphi-Quellcode:
//die 2. Anwendung
var
  Wnd: HWnd;
  MyCopyDataStruct: TCopyDataStruct;

begin
// Hier stehen noch andere Teile die ein Semaphore erstellen und das Handle (wnd) abfragen
//das funktioniert auch alles nur die Message nicht
If ParamStr(1) <> 'then with MyCopyDataStruct do
  begin
    dwData:=0;
    cbData:=Length(PChar(ParamStr(1))) + 1;
    lpData:=PChar(ParamStr(1));
    SendMessage(Wnd, WM_COPYDATA, Application.Handle, Integer(@MyCopyDataStruct));
  end;

//die 1. Anwedung, die auf die Message eigentlich warten sollte
procedure TForm1.WMCOPYDATA(var Msg: TWMCopyData);
var
  sText: array of Char;

begin
  SetLength(sText,Msg.CopyDataStruct.cbData);
  StrLCopy(PChar(sText), Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
  NewAVObject(PChar(sText)); //Prozedur zu weiteren Verarbeitung
end;
Warum kommt keine Nachricht an? Wird sie gar nicht erst gesendet? Das Handle (Wnd) zu dem die Nachricht gesendet wird stimmt aber.

Ich bin schon seit 3 Tagen am verzweifeln, ich hoffe mir kann jemand helfen.

Gruß
Mazel
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: WM_COPYDATA macht große Probleme

  Alt 17. Jul 2006, 14:44
Bist du sicher, dass das auch das Handle des Zielfensters ist?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

Re: WM_COPYDATA macht große Probleme

  Alt 17. Jul 2006, 14:46
Zitat:
und das Handle (wnd) abfragen
Poste diese Funktion bitte mal ...

Florian
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#4

Re: WM_COPYDATA macht große Probleme

  Alt 17. Jul 2006, 16:12
Hi,

es ist das richtige Handle, denn ich habe beim Start der ersten Anwendung mir eine Message zeigen lassen und als die zweite Anwendung getsartet wurde
ShowMessage(IntToStr(Application.Handle)); und
ShowMessage(IntToStr(Wnd)); beides mal war es gleich, sonst würde er auch nicht mit SetForegroundWindow(Wnd) die richtige Anwendung nach vorne bringen.

Aber hier trotzdem der Code (aus einer OneInst):
Delphi-Quellcode:
unit OneInst;

interface

{ Make a call to this procedure in your project source
  immediately before the first call to CreateForm.
  That should ensure it is after the Application.Title
  assignment that can muck up the logic.

  If you haven't set an application title yet, then
  do so to ensure this works }


uses
 Windows, Messages, SysUtils, Classes, Controls, Forms;

procedure EnsureSingleInstance (MyGUID : string) ;

implementation

uses
  WinTypes, WinProcs, Dialogs, UnitConst, Unit1;

procedure EnsureSingleInstance (MyGUID : string) ;
var
  Wnd: HWnd;
  WndClass, WndText: array[0..255] of char;
  MyCopyDataStruct: TCopyDataStruct;
begin
{$ifdef Win32} 
  { Try and create a semaphore. If we succeed, then check }
  { if the semaphore was already present. If it was }
  { then a previous instance is floating around. }
  { Note the OS will free the returned semaphore handle }
  { when the app shuts so we can forget about it }
  if (CreateSemaphore(nil, 0, 1,
        PChar(MyGUID)) <> 0) and
     (GetLastError = Error_Already_Exists) then
{$else}
  if HPrevInst <> 0 then
{$endif}
  begin
    Wnd := GetWindow(Application.Handle, gw_HWndFirst);
    while Wnd <> 0 do
    begin
      { Look for the other TApplication window out there }
      if Wnd <> Application.Handle then
      begin
        { Check it's definitely got the same class and caption }
        GetClassName(Wnd, WndClass, Pred(SizeOf(WndClass)));
        GetWindowText(Wnd, WndText, Succ(Length(Form1.Caption)));
        if (StrPas(WndClass) = Application.ClassName) and
           (StrPas(WndText) = Form1.Caption) then
        begin
          { This technique is used by the VCL: post }
          { a message then bring the window to the }
          { top, before the message gets processed }
          PostMessage(Wnd, wm_SysCommand, sc_Restore, 0);
{$ifdef Win32}
           If ParamStr(1) <> 'then with MyCopyDataStruct do
           begin
            dwData:=WM_COMMUNICATE;
            cbData:=Length(PChar(ParamStr(1))) + 1;
            lpData:=PChar(ParamStr(1));
            SendMessage(Wnd, WM_COPYDATA, Application.Handle, Integer(@MyCopyDataStruct));
           end;

          SetForegroundWindow(Wnd);
{$else} 
          BringWindowToTop(Wnd);
{$endif}
          Halt
        end
      end;
      Wnd := GetWindow(Wnd, gw_HWndNext)
    end
  end
end;

end.
Gruß
Mazel
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: WM_COPYDATA macht große Probleme

  Alt 17. Jul 2006, 16:39
zeig mal die Definition von TForm1.WMCOPYDATA.
Da muss nämlich noch dazu, dass dies eine "Message-Funktion" ist und auf welche Message diese Funktion horchen soll.

z.Bsp.:
Delphi-Quellcode:
TForm1 = class (TForm)
  ...
  ...
  private
    ...
    procedure WMQUERYENDSESSION (var Msg: TWMQueryEndSession); message WM_QUERYENDSESSION;
  ...
end;
...
...
procedure TForm1.WMQUERYENDSESSION (var Msg: TWMQueryEndSession);
begin
  ...
  ...
  inherited;
end;
und wo hast Du eigentlich die Message WM_MYMESSAGE deklariert?
Und hast Du diese Message auch registriert?
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#6

Re: WM_COPYDATA macht große Probleme

  Alt 17. Jul 2006, 16:46
Sorry,

ich habe ich bisschen herum probiert, dort steht jetzt wieder WM_COPYDATA.

Wegen der ersten Frage:
Delphi-Quellcode:
private
  procedure WMCOPYDATA(var Msg: TWMCopyData); Message WM_COPYDATA;
...
...
end;
...
...
procedure TForm1.WMCOPYDATA(var Msg: TWMCopyData);
var
sText: array of Char;

begin
 SetLength(sText,Msg.CopyDataStruct.cbData);
 StrLCopy(PChar(sText), Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
 NewAVObject(PChar(sText));
end;
Ist in dieser Funktion das inherited notwendig?

Gruß
Mazel
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#7

Re: WM_COPYDATA macht große Probleme

  Alt 18. Jul 2006, 14:22
Gibt es eine andere Möglichkeit um den Parameter von der zweiten Instanz zur ersten zu übertragen?

Gruß
Mazel
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#8

Re: WM_COPYDATA macht große Probleme

  Alt 18. Jul 2006, 14:25
Ha Mazel,

ich hatte in diesem Posting mal ein Beispiel.
Eventuell hilft Dir das ja etwas?
Stephan B.
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#9

Re: WM_COPYDATA macht große Probleme

  Alt 18. Jul 2006, 14:43
Hi,

danke, nur bringt mir das nicht soviel. Ich möchte Nachrichten von einer Instanz (Anwendung) zu einer anderen Senden.

Was bedeutet eigentlich das Owner in:
hWnd := (Owner AS TForm).Handle; Ich habe 2 Codeschnippsel. Bei einem kommt auch das Owner vor, in dem funktioniert die Parameter übergabe aber da gibt es andere Dinge die mir nciht gefallen und in der anderen kommt das eben nicht vor (die obere).

Gruß
Mazel
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Flippo

Registriert seit: 26. Sep 2004
111 Beiträge
 
Delphi 2005 Personal
 
#10

Re: WM_COPYDATA macht große Probleme

  Alt 18. Jul 2006, 16:39
Hi,

wollte das selber mal hinkriegen und dein post hat mir dabei sehr geholfen, nun kann ich dir evtl. helfen:

Du solltest beachten, dass du das handle der Form brauchst und nicht das der Application, das sind zwei verschiedene Dinge, in deiner Abfrage vergleichst du nämlich application.handle mit dem Handle an das du senden willst, du musst es aber an die form schicken.

Hoffe das löst bei dir auch die Probleme meins funzt jezt so...

MFG

Flippo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:49 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