Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Comandline und WM_COPYDATA (https://www.delphipraxis.net/194263-comandline-und-wm_copydata.html)

EWeiss 3. Nov 2017 16:40


Comandline und WM_COPYDATA
 
Eigentlich eine einfache Sache.

Delphi-Quellcode:
    WM_COPYDATA:
      begin
        CopyDataStruct := Pointer(lP);
        ExecuteCmdLine(CopyDataStruct.lpData);
      end;
Frage mich nur warum alle Strings auch wenn ich diese über Parameter in der IDE verschicke der erste Char leer ist ' '

bsp: "C:\Test\Meine Daten.txt" kommen dann so an. " C:\Test\Meine Daten.txt"
Das hat zur folge das ich beim prüfen mit
Delphi-Quellcode:
if FileExists(Title) then


die Datei nicht gefunden wird.
Ich kann das jetzt mit TrimLeft zurecht rücken aber das ist eigentlich nicht der sinn der Sache.


gruss

TiGü 3. Nov 2017 17:05

AW: Comandline und WM_COPYDATA
 
Wie befüllst du die Strings in LP oder bzw. lpData?


Bringt es was wenn du das so schreibst?
Delphi-Quellcode:
   WM_COPYDATA:
      begin
        CopyDataStruct := PCopyDataStruct(lP);
        ExecuteCmdLine(CopyDataStruct.lpData);
      end;

EWeiss 3. Nov 2017 17:09

AW: Comandline und WM_COPYDATA
 
Zitat:

Zitat von TiGü (Beitrag 1385038)
Wie befüllst du die Strings in LP oder bzw. lpData?


Bringt es was wenn du das so schreibst?
Delphi-Quellcode:
   WM_COPYDATA:
      begin
        CopyDataStruct := PCopyDataStruct(lP);
        ExecuteCmdLine(CopyDataStruct.lpData);
      end;

In LP.

Danke werde es mal versuchen.

gruss

TiGü 3. Nov 2017 17:10

AW: Comandline und WM_COPYDATA
 
Zitat:

Zitat von EWeiss (Beitrag 1385041)
Zitat:

Zitat von TiGü (Beitrag 1385038)
Wie befüllst du die Strings in LP oder bzw. lpData?

In LP.

Wie! Die Frage war: Wie?
Nicht wohin/worauf!

EWeiss 3. Nov 2017 17:21

AW: Comandline und WM_COPYDATA
 
Zitat:

Zitat von TiGü (Beitrag 1385042)
Zitat:

Zitat von EWeiss (Beitrag 1385041)
Zitat:

Zitat von TiGü (Beitrag 1385038)
Wie befüllst du die Strings in LP oder bzw. lpData?

In LP.

Wie! Die Frage war: Wie?
Nicht wohin/worauf!

Hatte ich oben ja schon geschrieben. ;)

Über die Parameter in der Delphi IDE wenn du das meinst.
Nein da ist keine Änderung der erste Char ist ' '.

Wenn die Anwendung offen ist und ich verwende DragDrop dann geht's.
Verwende ich DragDrop auf mein Anwendungs Icon dann geht es nicht auch über die Parameter der IDE nicht.

gruss

Bernhard Geyer 3. Nov 2017 18:40

AW: Comandline und WM_COPYDATA
 
Wie erstellst du die WM_COPYDATA-Nachricht, nicht wie verarbeitest du diese.
Und unsere Erfahrung ist das WM_COPYDATA nur funktioniert wenn man sie zwischen verschiedenen Anwendungen versendet.
In einer Anwendung (z.B. zwischen einer DLL und Exe) hatten wir immer wieder probleme bis wir diese Lösung ausgebaut hatten.

EWeiss 3. Nov 2017 18:49

AW: Comandline und WM_COPYDATA
 
Zitat:

Wie erstellst du die WM_COPYDATA-Nachricht, nicht wie verarbeitest du diese.
Ach so jetzt weis ich was ihr meint. :wall:

hat sich erledigt.

Danke.

gruss

Bernhard Geyer 3. Nov 2017 20:51

AW: Comandline und WM_COPYDATA
 
Zitat:

Zitat von EWeiss (Beitrag 1385051)
Zitat:

Wie erstellst du die WM_COPYDATA-Nachricht, nicht wie verarbeitest du diese.
Ach so jetzt weis ich was ihr meint. :wall:

hat sich erledigt.

Danke.

gruss

Uund was war es jetzt?

EWeiss 3. Nov 2017 20:54

AW: Comandline und WM_COPYDATA
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1385067)
Zitat:

Zitat von EWeiss (Beitrag 1385051)
Zitat:

Wie erstellst du die WM_COPYDATA-Nachricht, nicht wie verarbeitest du diese.
Ach so jetzt weis ich was ihr meint. :wall:

hat sich erledigt.

Danke.

gruss

Uund was war es jetzt?

Habe den freien Char selbst angehängt.. Manchmal ist man einfach nur blöd.

vorher!
Delphi-Quellcode:
      // Commandline Parameter auswerten
      if ParamCount > 0 then
      begin
        StartParams := '';
        for Params := 1 to ParamCount do
          StartParams := StartParams + ' ' + ParamStr(Params);

        pName := PWideChar(StartParams);
        CopyDataStruct.dwData := 0;
        CopyDataStruct.cbData := (StrLen(pName) + 1) * sizeof(Char);
        CopyDataStruct.lpData := pName;

        SendMessage(Prop.MainHandle, WM_COPYDATA, 0, integer(@CopyDataStruct));
      end;
nachher..
Delphi-Quellcode:
      // Commandline Parameter auswerten
      if ParamCount > 0 then
      begin
        StartParams := '';
        for Params := 1 to ParamCount do
        if Params = 1  then
          StartParams := StartParams + ParamStr(Params)
        else
        StartParams := StartParams + ' ' + ParamStr(Params);

        pName := PWideChar(StartParams);
        CopyDataStruct.dwData := 0;
        CopyDataStruct.cbData := (StrLen(pName) + 1) * sizeof(Char);
        CopyDataStruct.lpData := pName;

        SendMessage(Prop.MainHandle, WM_COPYDATA, 0, integer(@CopyDataStruct));
      end;
Kann man bestimmt schöner (professioneller) machen aber mir reicht es so.

gruss

mensch72 4. Nov 2017 12:19

AW: Comandline und WM_COPYDATA
 
kleiner Tip am Rande:
da im Prinzip jeder ein WM_COPYDATA verschicken kann, ist ohne z.B. Check(summe) nicht kaum zu garantieren, das man eine gültige Message von seiner eigenen Gegenstelle empfängt.

=> man kann im einfachsten Fall dwData beim Senden mit einer z.B. CRC32 über einen speziellen Startwert, der Länge und den Nutzdaten belegen... der Empfangscode kann nun vor "Verarbeitung" zumindest mit sehr hoher Sicherheit prüfen, ob es eine eigenen und gültige WM_COPYDATA Nachricht ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.
Seite 1 von 2  1 2      

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