AGB  ·  Datenschutz  ·  Impressum  







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

Dateipfad + Dateiname kopieren

Ein Thema von Gentleman · begonnen am 14. Mär 2006 · letzter Beitrag vom 14. Mär 2006
Antwort Antwort
Gentleman

Registriert seit: 29. Sep 2004
302 Beiträge
 
Turbo Delphi für Win32
 
#1

Dateipfad + Dateiname kopieren

  Alt 14. Mär 2006, 13:45
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:
Schlüsselname: HKEY_CLASSES_ROOT\*\shell\GetPath\command
Wert 0
Name: <KEIN NAME>
Typ: REG_SZ
Daten: "progg.exe" "%1"

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!
Lennard
Der Vorteil der Klugheit besteht darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger. (Kurt Tucholsky)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Dateipfad + Dateiname kopieren

  Alt 14. Mär 2006, 13:50
Programm nur einmal starten: Hier im Forum suchenmutex

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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Dateipfad + Dateiname kopieren

  Alt 14. Mär 2006, 13:57
Moin Lennard,

da käme dann auch die Erstellung eines MSDN-Library durchsuchenContext Menu Handlers in Frage.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Dateipfad + Dateiname kopieren

  Alt 14. Mär 2006, 14:27
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.

Link

Gruß Hawkeye
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#5

Re: Dateipfad + Dateiname kopieren

  Alt 14. Mär 2006, 14:36
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
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
Gentleman

Registriert seit: 29. Sep 2004
302 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Dateipfad + Dateiname kopieren

  Alt 14. Mär 2006, 15:01
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:
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.
Allerdings bekomme ich dann nur einen Fehler ("Runtime error 216 at 00403496"). Leider weiß ich nicht wo ich da nun den Fehler gemacht habe.

@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.
Lennard
Der Vorteil der Klugheit besteht darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger. (Kurt Tucholsky)
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Dateipfad + Dateiname kopieren

  Alt 14. Mär 2006, 15:29
Zitat von Gentleman:

Allerdings bekomme ich dann nur einen Fehler ("Runtime error 216 at 00403496"). Leider weiß ich nicht wo ich da nun den Fehler gemacht habe.
versuch mal, die unit sharemem einzubinden.
das hilft meist beim 216-er.

kannst ja auch mal die Suche bemühen zu sharemem...
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  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 15:22 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