Delphi-PRAXiS

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.

EWeiss 4. Nov 2017 12:25

AW: Comandline und WM_COPYDATA
 
Zitat:

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.
Das prüfe ich gegen mit Extension die gültig sein müssen und ob die Datei existiert bevor der Link zur Datei gestartet wird.
Sehe da eigentlich kein Problem.

Wenn sie ungültig ist wird sie einfach nicht verarbeitet.

Danke.

gruss

Glados 4. Nov 2017 13:18

AW: Comandline und WM_COPYDATA
 
Vielleicht wäre das hier auch eine Möglichkeit zur Verifikation. Werde ich selber später mal testen.

https://stackoverflow.com/questions/...16703#35516703

himitsu 4. Nov 2017 17:15

AW: Comandline und WM_COPYDATA
 
Zitat:

Zitat von EWeiss (Beitrag 1385069)
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;

Wie ist StartParams deklariert?
Ich hoffe als WideString oder UnicodeString, wegen PWideChar und nicht PChar.
Und pName ist auch ein PWideChar?

Warum SizeOf(Char) und nicht SizeOf(WideChar) obwohl es doch PWideChar ist.
Genauso warum StrLen und nicht StrLenW, wenn man WideChar und nicht Char verwendet.

Und warum der böse Integer-Case beim SendMessage?
Schonmal was von 64 Bit gehört?
WPARAM, LPARAM und LRESULT sind die korrekten Typen.


Das ist so ein Code, der nur noch knallen kann, wenn er in einem Nicht-Unicode-Delpho oder in FreePascal genutzt wird,
und unter 64 Bit bereitet er einem auch nur noch Freude.

Glados 4. Nov 2017 17:24

AW: Comandline und WM_COPYDATA
 
Zitat:

und unter 64 Bit bereitet er einem auch nur noch Freude.
Ich hatte mal die Möglichkeit meinen Code bei einem Bekannten testen zu dürfen, der eine 64-Bit-Delphi-Lizenz hat.
Ich verwende auch diesen bösen Integer-Cast und Char. Es hat zu keinem Zeitpunkt geknallt.

Wie sähe das oben gezeigte Code-Exemplar denn RICHTIG aus?

EWeiss 4. Nov 2017 17:24

AW: Comandline und WM_COPYDATA
 
Zitat:

Wie ist StartParams deklariert?
Ist WideString..

Zitat:

Und pName ist auch ein PWideChar?
Ja.

Zitat:

SizeOf(Char)
war ein Fehler berichtigt.

Zitat:

StrLenW
Gibt es unter D2010 nicht.
StrLen ist richtig wenn ich PWideChar übergebe.
SysUtils!
Delphi-Quellcode:
function StrLen(const Str: PWideChar): Cardinal;
Delphi-Quellcode:
function StrLen(const Str: PAnsiChar): Cardinal;

Zitat:

LPARAM
Delphi-Quellcode:
LPARAM(@CopyDataStruct));

korrigiert wenn auch nicht nötig die Anwendung ist 32Bit nicht 64Bit.

gruss

EWeiss 4. Nov 2017 17:25

AW: Comandline und WM_COPYDATA
 
Zitat:

Zitat von Glados (Beitrag 1385150)
Zitat:

und unter 64 Bit bereitet er einem auch nur noch Freude.
Ich hatte mal die Möglichkeit meinen Code bei einem Bekannten testen zu dürfen, der eine 64-Bit-Delphi-Lizenz hat.
Ich verwende auch diesen bösen Integer-Cast und Char. Es hat zu keinem Zeitpunkt geknallt.

Wie sähe das oben gezeigte Code-Exemplar denn RICHTIG aus?

LPARAM(@CopyDataStruct));

gruss

Glados 4. Nov 2017 17:27

AW: Comandline und WM_COPYDATA
 
Habe selbe Zeile auch schon mit DWORD gesehen.
Hier wird u.a. auch Integer verwendet http://www.cryer.co.uk/brian/delphi/...eforfolder.htm

EWeiss 4. Nov 2017 17:36

AW: Comandline und WM_COPYDATA
 
Zitat:

Zitat von Glados (Beitrag 1385154)
Habe selbe Zeile auch schon mit DWORD gesehen.
Hier wird u.a. auch Integer verwendet http://www.cryer.co.uk/brian/delphi/...eforfolder.htm

Er bezieht das auf 64BIT eigentlich kann man es vernachlässigen habe auch immer Integer verwendet in 32Bit Anwendungen und noch nie Probleme.
Aber gut habe es geändert.

Delphi-Quellcode:
LPARAM = INT_PTR;
INT_PTR = Integer;
am ende ein Integer... (32Bit) gehüpft wie gesprungen.
ABER! Jetzt kommt's.. sieht schöner aus. ;)

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 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