Entwickler-Ecke
Windows API - Programm mit Datei verknüpfen / Übergebene Parameter: Fehler
Terra23 - So 08.11.09 19:01
Titel: Programm mit Datei verknüpfen / Übergebene Parameter: Fehler
Hi!
Ich möchte, dass mein Programm mit bestimmten Dateien verknüpft wird.
Dazu habe ich im EasyHelper folgenden Code gefunden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| function InstallExt(Extension, ExtDescription, FileDescription, OpenWith, ParamString: string; IconIndex: Integer = 0): Boolean; var Reg: TRegistry; begin Result := False; if Extension <> '' then begin if Extension[1] <> '.' then Extension := '.' + Extension;
Reg := TRegistry.Create; try Reg.RootKey := HKEY_CLASSES_ROOT; if Reg.OpenKey(Extension, True) then begin Reg.WriteString('', ExtDescription); if Reg.OpenKey('\' + ExtDescription, True) then begin Reg.WriteString('', FileDescription); if Reg.OpenKey('DefaultIcon', True) then begin Reg.WriteString('', Format('%s,%d', [OpenWith, IconIndex])); if Reg.OpenKey('\' + ExtDescription + '\Shell\Open\Command', True) then begin Reg.WriteString('', Format('"%s" "%s"', [OpenWith, ParamString])); Result:=True; end; end; end; end; finally Reg.Free; end; end; end; |
Leider bekomme ich an der Stelle...
Delphi-Quelltext
1:
| Reg.WriteString('', Format('%s,%d', [OpenWith, IconIndex])); |
... die Fehlermeldung "Operator oder Semikolon fehlt". Was ist denn daran falsch?
Gruß,
Terra
jaenicke - So 08.11.09 19:19
Das kann ich nicht reproduzieren. Bei mir kompiliert der Quelltext einwandfrei. :nixweiss:
Kann es sein, dass das ein Folgefehler ist oder bei dir das doch nicht ganz exakt so aussieht (Semikolon weg oder so)?
Terra23 - So 08.11.09 20:19
Ich weiß zwar nicht, was du unter Folgefehler verstehst, aber ich hatte einen Fehler drin. ;)
Ich hatte, als ich das Programm schrieb, eine globale Variable definiert, die Format hieß. Diese Variable habe ich nun umbenannt und nun funktioniert alles.
Gruß,
Terra
jaenicke - So 08.11.09 20:24
Das meinte ich: Dass der Fehler eine Folge aus dem vorhergehenden Quelltext ist. ;-)
Aber an der Stelle sieht man mal wieder wie wichtig gute Bezeichner sind. Denn so kurze / allgemeine Bezeichner haben natürlich immer das Risiko, dass die schon in Delphi benutzt werden.
Terra23 - So 08.11.09 20:33
Da hast du natürlich Recht.
Jetzt habe ich aber folgendes Problem:
Ich kann die Dateien, die ich benutze, nicht verknüpfen.
Ich rufe die Prozedur so auf:
Delphi-Quelltext
1: 2:
| If InstallExt('*.butler', 'DeckButler-Datei', 'DeckButler', ParamStr(0), '"%1"', 0) Then ShowMessage('Programm wurde verknüpft.'); |
Und eine andere Sache habe ich auch noch:
In EasyHelper steht, dass der Pfad in einem Parameter übergeben wird und man z.B. so aufrufen könnte:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.FormCreate(Sender: TObject); begin If (ParamCount>0) and (FileExists(ParamStr(1))) then Memo1.Lines.LoadFromFile(ParamStr(1)); end; |
In welcher Variablen befindet sich denn der Dateiname?
Gruß,
Terra
jaenicke - So 08.11.09 20:53
Schau dir einmal das Format in der Registry an. Bei deiner Dateierweiterung ist ein Stern zu viel. :zwinker:
Terra23 - So 08.11.09 21:39
jaenicke hat folgendes geschrieben : |
Schau dir einmal das Format in der Registry an. Bei deiner Dateierweiterung ist ein Stern zu viel. :zwinker: |
Sorry, aber ich finde in meiner Registry nichts. Kann es sein, dass das Programm nichts in die Registry geschrieben hat?
jaenicke - Mo 09.11.09 00:16
Bist du sicher, dass du an der richtigen Stelle geschaut hast?
Auf jeden Fall muss bei deinem Quelltext der Stern vor der Dateierweiterung weg. Und Adminrechte brauchst du natürlich auch.
Terra23 - Mo 09.11.09 00:39
Hi!
Ich habe nun den * rausgenommen und es funktioniert trotzdem nicht.
Weiterhin ist es so, dass ich in der Registry nichts finde, d.h. bei mir wird keine Dateinamenerweiterung in die Reg geschrieben.
Ich habe auch Admin-Rechte auf dem Laptop, da ich der einzige User und somit Admin bin.
Terra
jaenicke - Mo 09.11.09 00:49
Terra23 hat folgendes geschrieben : |
Ich habe auch Admin-Rechte auf dem Laptop, da ich der einzige User und somit Admin bin. |
Sofern es sich um XP und nicht um Vista oder Windows 7 handelt reicht das, ja.
Hast du einmal debuggt und geschaut, ob das Programm dort richtig abgearbeitet wird?
Terra23 - Mo 09.11.09 00:53
Ich habe XP und weiß, das ich Admin bin.
Was muss ich denn tun, um zu schauen, ob mein Programm dort richtig arbeitet?
Ich habe mal testweise den Aufruf für die Verknüpfung auf nen Button gelegt. Wenn ich den drücke, dann erhalte ich nichtmal die Message, d.h. InstallExt gibt mal nicht True zurück...
jaenicke - Mo 09.11.09 00:56
Dann gehe zeilenweise durch und schau was passiert. :nixweiss:
Terra23 - Mo 09.11.09 01:02
Wie mache ich das?
jaenicke - Mo 09.11.09 01:06
Du bist schon so lange dabei und kennst nicht das wichtigste Hilfsmittel beim Programmieren überhaupt? :shock:
http://www.delphi-treff.de/delphi-ide/debugger/
Kurzfassung: Haltepunkt setzen (F5), ausführen, mit F8 zeilenweise durchgehen.
Terra23 - Mo 09.11.09 14:36
:oops:
Ich bin zwar schon lange hier im Forum dabei, habe aber zwischendurch Jahre nichts mit Delphi gemacht. Zudem habe ich auch nur einige Grundlagen von Delphi in der Schule gelernt und da gehörte der Debugger nicht dazu.
Aber ich werd's mir mal ansehen.
Danke,
Terra
EDIT:
Ich habe nun den Fehler gefunden und inzwischen wird auch durch den InstallExt-Aufruf der Wert True zurückgegeben.
Allerdings steht in der Registry anschließend nur der Wert, der bei ExtDescription übergeben wurde.
Wenn ich nun auf eine Datei doppelklicke, dann öffnet sich auch das Programm.
Soweit so gut.
Aber es sind noch Fragen offen:
1) Wie kann ich den Dateien das Icon des Programms zuweisen?
2) In welchem Parameter steht der Pfad der Datei, die per Doppelklick geöffnet werden soll?
Terra
Delete - Mo 09.11.09 15:49
Terra23 hat folgendes geschrieben : |
1) Wie kann ich den Dateien das Icon des Programms zuweisen? |
Guck dir mal den letzten Parameter der Funktion an.
Zitat: |
2) In welchem Parameter steht der Pfad der Datei, die per Doppelklick geöffnet werden soll? |
Im ersten bzw. zweiten je nach dem wie man zählt:
ParamStr(0): Pfad des Programmes
ParamStr(1): Erster Kommandozeilenparameter
ParamStr(1): Zweiter Kommandozeilenparameter
ParamStr(n): n-ter Kommandozeilenparameter
Terra23 - Mo 09.11.09 15:56
Hi Luckie!
Ich habe mir den Parameter angesehen. Ich übergebe einen Integer. Leider weiß ich nicht, wie groß der Integer sein muss, damit er das Icon des Programms übergibt.
Ich habe mir schon gedacht, dass ich vielleicht aus Integer ein TIcon zu machen und dann die Variable mit "Application.Icon" zu füllen. Aber das ist wohl nicht im Sinne des Erfinders, oder?
Aus deinen anderen Angaben werde ich zwar nicht so schlau, aber ich werde mal die Hilfe zu Rate ziehen.
MfG
Terra
Delete - Mo 09.11.09 16:05
Da musst du mal in der Ressource deiner Exe gucken, welchen Index das gewünschte Icon hat.
Terra23 - Mo 09.11.09 18:02
Luckie hat folgendes geschrieben : |
Da musst du mal in der Ressource deiner Exe gucken, welchen Index das gewünschte Icon hat. |
Ich muss schon wieder fragen: Wie mache ich das?
Was deine Antwort mit den ParamStr's angeht, habe ich mal spaßeshalber ne Schleife gebaut und 20 ParamStr's abgefragt und diese in ein Memo geladen.
Da ergab sich folgendes Problem (Tiefstriche markieren die Stelle, wo eigentlich Leerzeichen sein sollten):
ParamStr(0) = Programmpfad
(1) = C:\Dokumente_
(2) = und_
(3) = Einstellungen\Lex\Eigene_
(4) = Dateien\DeckButler_
(5) = Decks\Blackwing.dckf
Die anderen ParamStr's sind leer.
Das heißt, es wurde der komplette Pfad immer dort getrennt wo sich Leerzeichen befinden und ich müsste jetzt die Leerzeichen wieder einfügen (die sind ja gelöscht und müssten dort stehen, wo ich nun Tiefstriche hingesetzt habe) und die einzelnen Strings zu einem Gesamt-String zusammenbauen. Das kann ja irgendwie auch nicht sein, oder? Es stellt zwar kein großes Problem dar, aber soweit ich den Code aus EasyHelper verstanden habe, sollte der komplette (!!!) Pfad in einem ParamStr übergeben werden.
Gruß,
Terra
Delete - Mo 09.11.09 21:44
Pfade mit Leerzeichen müssen in Anführungszeichen gesetzt werden. Das musst du natürlich auch beim Eintragen in die Registry berücksichtigen: "%1".
Terra23 - Mo 09.11.09 22:00
Ja, aber genau das tue ich doch.
Ich schreibe doch:
Delphi-Quelltext
1: 2:
| If InstallExt('.dckf', 'DeckButler-Datei', 'DeckButler', ParamStr(0), '"%1"', 0) Then ShowMessage('Programm wurde verknüpft.'); |
Da steht ja "%1" und das ganze natürlich in den Einzel-Gänsefüßchen, die ja für nen String nötig sind.
Dadurch werden alle DCKF-Dateien mit meinem Programm verknüpft.
Das funktioniert schon super. Was mir jetzt noch Probleme bereitet, ist die Tatsache, dass die Pfadangabe der Datei aufgesplittet wird (wie vorher geschrieben) und ich auch nicht weiß, wie ich an den Index des Icons der Application rankomme.
Terra
Martok - Di 10.11.09 20:12
RTFC. (Gibts die Abkürzung? Read The Fu**ing Code...)
Delphi-Quelltext
26:
| { ... } Reg.WriteString('', Format('"%s" "%s"', [OpenWith, ParamString])); |
Und was ergibt das mit ParamString='"%1"'?
Ist also einmal zuviel. Da die bei komplizierteren ParamStrings sowieso stören werden, würde ich die Zeile in der InstallExt ändern:
Delphi-Quelltext
26:
| { ... } Reg.WriteString('', Format('"%s" %s', [OpenWith, ParamString])); |
Dann sollte es auch mit dem
InstallExt('*.butler', 'DeckButler-Datei', 'DeckButler', ParamStr(0), '"%1"', 0) klappen ;)
Terra23 - Di 10.11.09 20:18
Danke, ich werde mir das mal ansehen. Und sorry für meine Ungeduld...
Terra23 - Di 10.11.09 21:13
Sorry 4 Doppelpost, aber ich wollte euch nur mitteilen, dass ich es endlich hinbekommen habe, ohne dass ich mir den Pfad selbst zusammensetzen muss. Danke für eure Hilfe und nochmal sorry an Xentar, dass ich ihn so angemacht habe.
Abschließend habe ich noch eine Frage:
Der Aufruf klappt soweit und wenn ich 0 übergebe, erhalte ich auch damit das Icon meines Programms.
Wenn ich die DCKF-Dateien nun aber im Explorer ansehe, dann haben die nicht das Symbol bekommen. Wenn ich sie über den OpenDialog meines Programms öffne, dann hat jede Datei als Symbol das Symbol meines Programms. Woran kann das liegen?
Terra
Xentar - Di 10.11.09 21:32
Terra23 hat folgendes geschrieben : |
und nochmal sorry an Xentar, dass ich ihn so angemacht habe. |
Nun reichts aber, werds schon überleben ;)
Terra23 hat folgendes geschrieben : |
Wenn ich die DCKF-Dateien nun aber im Explorer ansehe, dann haben die nicht das Symbol bekommen. Wenn ich sie über den OpenDialog meines Programms öffne, dann hat jede Datei als Symbol das Symbol meines Programms. Woran kann das liegen? |
Ich schmeiß mal das Stichwort Iconcache in den Raum.
Schau mal, ob das nach nem Reboot immernoch ist?
Alternativ kann man den Iconcache auch händisch löschen, siehe
http://www.edv-tipp.de/docs/Icon_cache.htm
(den Teil mit der Registry muss man nicht machen)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!