AGB  ·  Datenschutz  ·  Impressum  







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

Comandline und WM_COPYDATA

Ein Thema von EWeiss · begonnen am 3. Nov 2017 · letzter Beitrag vom 4. Nov 2017
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Comandline und WM_COPYDATA

  Alt 3. Nov 2017, 17:21
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

Geändert von EWeiss (11. Jul 2019 um 15:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.223 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Comandline und WM_COPYDATA

  Alt 3. Nov 2017, 18:40
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Comandline und WM_COPYDATA

  Alt 3. Nov 2017, 18:49
Zitat:
Wie erstellst du die WM_COPYDATA-Nachricht, nicht wie verarbeitest du diese.
Ach so jetzt weis ich was ihr meint.

hat sich erledigt.

Danke.

gruss

Geändert von EWeiss ( 3. Nov 2017 um 20:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.223 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Comandline und WM_COPYDATA

  Alt 3. Nov 2017, 20:51
Zitat:
Wie erstellst du die WM_COPYDATA-Nachricht, nicht wie verarbeitest du diese.
Ach so jetzt weis ich was ihr meint.

hat sich erledigt.

Danke.

gruss
Uund was war es jetzt?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Comandline und WM_COPYDATA

  Alt 3. Nov 2017, 20:54
Zitat:
Wie erstellst du die WM_COPYDATA-Nachricht, nicht wie verarbeitest du diese.
Ach so jetzt weis ich was ihr meint.

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

Geändert von EWeiss ( 3. Nov 2017 um 20:58 Uhr)
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#6

AW: Comandline und WM_COPYDATA

  Alt 4. Nov 2017, 12:19
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Comandline und WM_COPYDATA

  Alt 4. Nov 2017, 12:25
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.398 Beiträge
 
Delphi 12 Athens
 
#8

AW: Comandline und WM_COPYDATA

  Alt 4. Nov 2017, 17:15
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#9

AW: Comandline und WM_COPYDATA

  Alt 4. Nov 2017, 17:24
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?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Comandline und WM_COPYDATA

  Alt 4. Nov 2017, 17:24
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!
function StrLen(const Str: PWideChar): Cardinal; function StrLen(const Str: PAnsiChar): Cardinal;
Zitat:
LPARAM
LPARAM(@CopyDataStruct));
korrigiert wenn auch nicht nötig die Anwendung ist 32Bit nicht 64Bit.

gruss

Geändert von EWeiss ( 5. Nov 2017 um 08:33 Uhr)
  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 19:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz