![]() |
Comandline und WM_COPYDATA
Eigentlich eine einfache Sache.
Delphi-Quellcode:
Frage mich nur warum alle Strings auch wenn ich diese über Parameter in der IDE verschicke der erste Char leer ist ' '
WM_COPYDATA:
begin CopyDataStruct := Pointer(lP); ExecuteCmdLine(CopyDataStruct.lpData); end; 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 |
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; |
AW: Comandline und WM_COPYDATA
Zitat:
Danke werde es mal versuchen. gruss |
AW: Comandline und WM_COPYDATA
Zitat:
Nicht wohin/worauf! |
AW: Comandline und WM_COPYDATA
Zitat:
Ü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 |
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. |
AW: Comandline und WM_COPYDATA
Zitat:
hat sich erledigt. Danke. gruss |
AW: Comandline und WM_COPYDATA
Zitat:
|
AW: Comandline und WM_COPYDATA
Zitat:
vorher!
Delphi-Quellcode:
nachher..
// 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;
Delphi-Quellcode:
Kann man bestimmt schöner (professioneller) machen aber mir reicht es so.
// 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; gruss |
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. |
AW: Comandline und WM_COPYDATA
Zitat:
Sehe da eigentlich kein Problem. Wenn sie ungültig ist wird sie einfach nicht verarbeitet. Danke. gruss |
AW: Comandline und WM_COPYDATA
Vielleicht wäre das hier auch eine Möglichkeit zur Verifikation. Werde ich selber später mal testen.
![]() |
AW: Comandline und WM_COPYDATA
Zitat:
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. |
AW: Comandline und WM_COPYDATA
Zitat:
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? |
AW: Comandline und WM_COPYDATA
Zitat:
Zitat:
Zitat:
Zitat:
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:
Delphi-Quellcode:
LPARAM(@CopyDataStruct));
korrigiert wenn auch nicht nötig die Anwendung ist 32Bit nicht 64Bit. gruss |
AW: Comandline und WM_COPYDATA
Zitat:
gruss |
AW: Comandline und WM_COPYDATA
Habe selbe Zeile auch schon mit DWORD gesehen.
Hier wird u.a. auch Integer verwendet ![]() |
AW: Comandline und WM_COPYDATA
Zitat:
Aber gut habe es geändert.
Delphi-Quellcode:
am ende ein Integer... (32Bit) gehüpft wie gesprungen.
LPARAM = INT_PTR;
INT_PTR = Integer; ABER! Jetzt kommt's.. sieht schöner aus. ;) gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:33 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