![]() |
Dateipfad + Dateiname kopieren
Hallo!
Ich möchte mit einem kleinen Tool den Pfad + Dateinamen von Dateien kopieren. Bisher habe ich es folgendermaßen gelöst:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin if (ParamCount<> 0) and (ParamStr(1)<> '') then begin Clipboard.AsText:= ParamStr(1); CanClose:= True; end else begin ShowMessage('ERROR'); CanClose:= False; end; end; Dazu habe ich das Kontextmenü, im Explorer um einen Eintrag erweitert, mit dem ich nun das Programm öffne. Den Menüeintrag habe ich in der Registry eingetragen: Zitat:
Wenn ich nun im Explorer mit der rechten Maustaste eine Datei anwähle und meinen Menüeintrag anwähle, wird mein Programm gestartet und der Pfad, der ausgewählten Datei wird kopiert. Das funktioniert auch soweit. Nun möchte ich aber, dass das Programm nicht jedes mal wieder gestartet werden muss, um den Dateipfad zu kopieren. Es soll im Hintergrund laufen und beim anwählen des Menüeintrages sollen die nötigen Parameter an das Programm übermittelt werden, ohne dass es erneut gestartet wird. Wie könnte ich das umsetzen? Ich hoffe ihr könnt mir weiterhelfen. Danke! Gruß Lennard! |
Re: Dateipfad + Dateiname kopieren
Programm nur einmal starten:
![]() Kurze Erklärung: Wenn schon eine UInstanz deines programmes existiert, schickt die zweite ihre Startparameter an die erste Instanz, zum Beispiel mit WM_COPYDATA und beendet sich dann. Die erste Instanz reagiert auf WM_COPYDATA und tut was ein männliches Programm tun muss. |
Re: Dateipfad + Dateiname kopieren
|
Re: Dateipfad + Dateiname kopieren
Hallo Lennard,
falls es Dir nur um die Funktion, nicht aber um das Programmieren geht: die PowerToys für Windows95 enthalten unter anderem das Tool "Send To X", mit dem sich Dateipfad und Name in die Zwischenablage kopieren lassen. Das funktioniert sogar unter XP sehr zuverlässig. ![]() Gruß Hawkeye |
Re: Dateipfad + Dateiname kopieren
Ich bin zwar kein Fan von NonVCL,
aber hier wärs sicher angebracht drüber nachzudenken das Programm (EXE) so klein wie möglich zu machen. Dann würds auch nicht auffallen, wenn es immer wieder gestartet wird. Ich persöhnlich würde die Variante bevorzugen, die eben nicht dauernt im Speicher lauert sondern nur bei Bedarf startet. Bzw. Welchen Grund hast du, das dein Programm nicht immer wieder neu gestartet werden kann/soll ? mfg DerDan |
Re: Dateipfad + Dateiname kopieren
Danke für die schnelle Hilfe! :)
Ich habe jetzt mal ein bisschen rumprobiert. Ich habe es geschafft, dass das Programm nur einmal aufgerufen wird, allerdings habe ich immernoch Probleme die Daten zu senden. So sieht mein Code aus:
Delphi-Quellcode:
Allerdings bekomme ich dann nur einen Fehler ("Runtime error 216 at 00403496"). Leider weiß ich nicht wo ich da nun den Fehler gemacht habe.
procedure TForm1.SendParam;
var aCopyData: TCopyDataStruct; hTargetWnd: HWND; begin with aCopyData do begin dwData := 0; cbData := StrLen(PChar(ParamStr(1))) + 1; lpData := PChar(ParamStr(1)); end; hTargetWnd := FindWindowEx(0, 0, nil, PChar('test')); if hTargetWnd <> 0 then SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@aCopyData)) else ShowMessage('No Recipient found!'); end; procedure TForm1.WMCopyData(var Msg: TWMCopyData); var sText: array[0..99] of Char; begin StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData); label1.Caption := sText; end; Initialization mHandle := CreateMutex(nil,True,'test'); if GetLastError = ERROR_ALREADY_EXISTS then begin Form1.SendParam; Halt; end; finalization if mHandle <> 0 then CloseHandle(mHandle) end. @DerDa: NonVCL wäre da vielleicht echt eine gute Möglichkeit, habe ich bisher noch gar nicht dran gedacht. Allesdings habe ich noch nichts in Richtung nonVCL gemacht. |
Re: Dateipfad + Dateiname kopieren
Zitat:
das hilft meist beim 216-er. kannst ja auch mal die Suche bemühen zu sharemem... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:01 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