Entwickler-Ecke

Windows API - Aktuell markierte Datei auslesen


mcbain - Mi 13.04.11 12:59
Titel: Aktuell markierte Datei auslesen
Hallo,
ich habe eine Anwendung geschrieben, welche im Kontextmenü einer jeden Datei hinterlegt ist. Jetzt würde ich gerne bei Aufruf meiner Anwendung den Namen der Datei wissen, welche ich gerade ausgewählt habe.

Mit

Delphi-Quelltext
1:
GetDir(0, Result)                    

bekomme ich zwar schonmal das Arbeitsverzeichnis der gewählten Datei, aber noch nicht den Dateinamen.
Kennt jemand eine Möglichkeit das Verzeichnis + Dateinamen einer markierten Datei auszulesen?

Wäre für jeden Hinweis dankbar.


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 13.04.2011 um 13:03


Delete - Mi 13.04.11 14:08

Dafür brauchst du eine ShellExtension:
http://www.michael-puff.de/Programmierung/Delphi/Programme -> ExifReader.zip


jaenicke - Mi 13.04.11 14:23

user profile iconmcbain hat folgendes geschrieben Zum zitierten Posting springen:
ich habe eine Anwendung geschrieben, welche im Kontextmenü einer jeden Datei hinterlegt ist. Jetzt würde ich gerne bei Aufruf meiner Anwendung den Namen der Datei wissen, welche ich gerade ausgewählt habe.
Den bekommst du vermutlich als Parameter, je nachdem ob es sich um eine ShellExtension handelt (dann nicht) oder du einfach die Exe als Kommando in shell\open in der Registry eingetragen hast (dann schon).


mcbain - Mi 13.04.11 14:27

Mit dem ExifReader kann ich die aktuell in Windows markierte Datei, z.b. test.exe, ermitteln und den string in Delphi verwenden?
Kommt mir alles bischen komisch vor in dem zip-file.


Delete - Mi 13.04.11 14:45

Ja.


mcbain - Do 14.04.11 08:09

Vielen Dank für eure Antworten.
Ich habe es jetzt folgendermaßen geregelt:

Per Button installiere ich auf Bedarf meine Anwendung im Kontextmenü:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var regist : TRegistry; 
begin
  regist := TRegistry.Create;
                
  with regist do
  begin
    RootKey := HKEY_CLASSES_ROOT;
    OpenKey('*\shell\Delphi\',True);
    WriteString('',Application.ExeName);
    CloseKey;
    OpenKey('*\shell\Delphi\command',True);
    WriteString('',Application.ExeName+' "%1"');
    CloseKey;
  end;
  regist.Free;
end;


Rufe ich nun mit Rechtsklick irgendeine Anwendung im Windows Explorer auf und wähle meinen gerade erstellten Kontextmenü-Eintrag, so wird mein Programm aufgerufen.
Jetzt muss man nur noch mit ParamStr(1) den Parameter auslesen und schon hat man die Anwendung, die im Explorer markiert wurde.

Ich hoffe, ich konnte jemanden mit dem kleinen Beispiel weiterhelfen.
Gruß
mc


jaenicke - Do 14.04.11 08:26

Wobei da komplett die Fehlerbehandlung fehlt...
Du hast das try..finally vergessen, außerdem wirfst du den Rückgabewert von OpenKey weg statt zu prüfen, ob der Schlüssel geöffnet werden konnte. Und das kann ins Auge gehen, es sei denn deine Anwendung fordert beim Start bereits sowieso immer Adminrechte an (was ja auch wieder schlecht wäre). Andernfalls hat die Anwendung ja gar nicht immer die notwendigen Rechte...

Und da du dann nicht einmal den Rückgabewert von OpenKey prüfst :shock:, bekommst du ohne Adminrechte eine schöne Exception und hast, da du nicht einmal try..finally benutzt, ein schönes Speicherleck... von der unschönen Fehlermeldung durch die Exception im Programm ganz abgesehen...

Besser wäre zu schauen, ob du Adminrechte hast und andernfalls die Anwendung mit ShellExecute und 'runas' als Verb zu starten (mit Parametern, an denen du erkennst was passieren soll), damit es nicht nur bei wenigen zufällig funktioniert...


mcbain - Do 14.04.11 08:56

Ich habe hier natürlich nicht alles aufgenommen, sondern eben nur das notwendigste, damit andere schneller wissen wo und wie sie ansetzen müssen.
Natürlich sollte man das dann mit der Fehlerbehandlung etc. wie jaenicke es beschreibt einbauen. Danke für die Anregung.


Delete - Do 14.04.11 09:32

Du weißt aber, dass dein Programm dafür Administratorenrechte benötigt? Genauso, wie meine Shellerweiterung bei der Installation.