![]() |
InstallExt installiert Dateierweiterung erst nach Neustart
Hi,
wieso installiert folgender Code eine Dateiendung nicht sofort, sondern erst nach einem Neustart ? Auch Strg+F5 im Explorer hat nichts gebracht.
Delphi-Quellcode:
Ein Aufrufbeispiel:
function InstallExt(Extension, ExtDescription, FileDescription, OpenWith, ParamString, IconPfad: 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', [IconPfad, 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; // wie es hiermit steht weiß ich gerade nicht, aber ich poste ihn mal mit function UnInstallExt(Extension, ExtDescription: String): Boolean; var Reg: TRegistry; begin Reg := TRegistry.Create; try try with Reg do begin RootKey := HKEY_CLASSES_ROOT; DeleteKey(Extension); DeleteKey('\' + ExtDescription); Result := True; end; if Reg.OpenKey('DefaultIcon', True) then begin Reg.DeleteKey('DefaultIcon'); Result := True; end; except Result := False; end; finally Reg.Free; end; end;
Delphi-Quellcode:
InstallExt('.asd', 'asd irgendetwas', 'asd irgendetwas', 'asd.exe', '"%1"', 'asd.ico' , 0);
|
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Hi,
Nach dem Setzen der Dateierweiterungen ruf einfach dieses hier auf
Delphi-Quellcode:
Das sollte klappen.
// uses ShlObj oder ShellAPI musst mal schauen
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil); mfG mirage228 |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Danke, den hätte ich später auch noch gebraucht. In dem Aufruf ist irgendwo noch ein Fehler drinnen, da es weiterhin nicht klappt. Ich will es anhand eines "echten" Beispiels erläutern:
Angenommen, man möchte ASX auf ein Programm zuweisen (meins :P). Dann benötige ich einen Code, wie diesen, damit mein Programm auch noch andere Formate verwalten kann:
Delphi-Quellcode:
Nun zur eigentlichen Registration:
ExtDes := LowerCase(Ext); // Ext = .asx ; Diese Zuweisung macht wenig Sinn, aber es ist auch nur zu Testzwecken
FileDes := ExtDes; // auch sinnlos... Prg := ExtractFilePath(Application.ExeName) + 'DarkPlayerII.exe';
Delphi-Quellcode:
In der Registry steht daraufhin im Schlüssel .asx der Eintrag DefaultIcon, welcher den Pfad zum Icon enthält.
if InstallExt(Ext, ExtDes, FileDes, Prg, '"%1"', Ico , 0) then // Ico = Pfad+Dateiname
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil) else MsgBox(...); Unter .asx\Shell\Open\Command steht nun im Schlüssel Standard: Zitat:
|
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Also ich habe das bisher immer so gemacht,
dass in dem Schlüssel .asx in diesem Fall unter dem Standardwert der Verweis zu einem weiteren Schlüssel eingetragen, also meinetwegen der Wert ASXFile. Im HKEY_CLASSES_ROOT wird nun ein Schlüssel ASXFile angelegt, in welchem dann nun der shell\open\command-Schlüssel und der DefaultIcon-Schlüssel mit den entsprechenden Werten angelegt werden. Ich weiß nicht, ob das geht wenn Du das alles direkt in den .asx-Schlüssel packst... mfG mirage228 |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
inoffiziell geht es, aber ich würde auch zu mirage228's variante tendieren, da es eigentlich alle so machen.
|
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Moin Nils,
So rufst Du die Registrierung auf:
Delphi-Quellcode:
und das macht die Funktion damit:
if InstallExt(Ext, ExtDes, FileDes, Prg, '"%1"', Ico , 0) then
Delphi-Quellcode:
=> warum übergibst Du also %1 in ""?
Reg.WriteString('', Format('"%s" "%s"', [OpenWith, ParamString]));
|
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Zitat:
Die "richtige" Lösung wäre da eigentlich
Code:
und den Aufruf so lassen.
Reg.WriteString('', Format('"%s" [color=#ff0000]%s[/color]', [OpenWith, ParamString]));
Denn was ist, wenn man mal mehrere Parameter haben möchte? |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Es klappt immer noch nicht. In der Registry wird nun .ASX playlist erstellt. Dort steht dann DefaultIcon für das Icon und in .ASX playlist\Shell\Open\Command steht
Zitat:
Woran könnte das liegen ? |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
es wird also stattdessen mit dem dafür eingerichteten Standardplayer geöffnet?
ich sag es mal so .. höre auf uns und ändere deinen code entsprechend. du kannst zwar den ganzen "shell"-Zweig direkt in die Erweiterung ".asx" eintragen, jedoch wird dieser Zweig als ltztes abgefragt. Vorher wird in "\ASXFile\shell\..." (bei Mediaplayer) reingesehn und wenn da was steht, dann wird dieses ausgeführt. [add] was ich mich aber gerade frage. gab es nicht auch eine WinAPI für's "Erweiterung registrieren"? (wo man dann auf die ganze Ordnerstucktug nicht achten mußte, da es intern verwaltet wird) |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Wo finde ich diesen Eintrag ? Im Mediaplayerschlüssel ist nichts, liegt vlt. daran, dass er nicht mehr auf der Platte ist. Von der WinAPI-Variante habe ich noch nichts gehört und nichts im Forum gefunden.
|
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Im Defaultwert (dem ohne Namen) von HKEY_CLASSES_ROOT\.asx steht der Name des schlüssels drin, wo dann diese Daten rein müssen.
Der MediaPlayer nennt den halt ASXFile, beim Realplayer heißt der Realplayer.irgendwas.asf , oder so u.s.w WinAPI: Mir war vorhin so, als wenn ich hier mal irgendwann sowas gesehn hatte. im MSDN fand ich jetzt aber auch noch nichts. |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Ok, aber was ist dann an .ASX playlist von mir falsch ? In .asx steht auch ein korrekter Verweis.
|
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Es wird zuerst der andere eintrag ausgelesen und fals der nicht existiert, dann deiner.
Wenn also in dem "richtigen" Zweig schon was steht, dann wird deines nicht beachtet. |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Das weiß ich, aber wie heißt der genau ? Ich finde ihn via RegEdt nicht. ASXFile gibt es auch nicht.
|
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Liste der Anhänge anzeigen (Anzahl: 1)
Wirklich nicht 13?
Wie der Pfad bei dir heißt das steht da ... siehe Anhang Und wenn du das .asx z.B. selber erstellt hast, also/oder der andere Pfad noch nicht existiert ... dann erschaff ihn selber (dessen Name ist fast frei wählbar). am Einfachsten/Optimalsten .xyz > XYZFile, oder halt ProgramXYZ ..... |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zum Rest: Dann pack ich jetzt mal aus: Ich schreibe die Daten in DPASXFile (1) und der Verweis steht in .asx (2). Die Datei wird dennoch mit dem entsprechenden Programm geöffnet, obwohl nun die Dateizuweisungen afaik stimmen. Wenn er immer erst im Programmverzeichniss von dem entsprechenden Programm sucht, dann müsste man es rauskicken, aber war davon jemals die Rede. Das was du eben gesagt hast, hast du nun schon mehr als einmal gesagt und ich habe es immer erfolglos probiert umzusetzen. |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Liste der Anhänge anzeigen (Anzahl: 1)
nee, war nich bse gemeint ... das wo es steht schrieb ich ja schonal.
hab grad man versucht, ob die Groß-/Kleinschreibung bei shell/open/command was ausmacht, aber anschinend nicht. das Fehlen der Beschriftung war auch egal HKCR/shell/open/@='name' Bist du sicher, daß der Eintrag in HKCR/shell/open/command/@ richtig ist? schreib da mal nur notepad rein, dann sollte (wenn der eintrag gefunden wird) zumindestens de editor aufgehen. (ode das im Anhang importieren) |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Ich habe deine Datei geöffnet, aber ASX wird weiterhin mit dem Standardprogramm geöffnet.
|
Re: InstallExt installiert Dateierweiterung erst nach Neusta
hmmm, na dann stimmt was anderes nicht :shock:
Welches ist denn eigentlich dein Standardprogramm? bzw. ist da zufällig 'ne Option eingestellt, welche die Verknüpfungen prüft und bei Änderung wieder auf dieses umleitet? [add] ach ja, ein rechnerneustart bring auch nichts? |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Habe das Programm deinstalliert und in dem Dialog, welcher aufgerufen wird, wenn man die ASX öffnen will, mein Programm gewählt. Das hat mir nicht viel gebracht, da ich somit noch nicht wusste, ob mein Programm für Dateizuweisungen funktioniert oder nicht. Deshalb habe ich einfach mein kleines eigenes Playlistenformat verknüpft und siehe da: Es funktioniert einwandfrei. :) Danke!!
|
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Zitat:
PS: hier is z.B. der RealPlayer drauf, aber der gibt zumindestens vorher Bescheid, bevor er die Einträge wieder auf sich umschreibt PS2: es gbit ja auch noch andere Wege eine Datei zu verknüpfen (über OLE, oder so), aber ich dachte dafür wäre auch irgendein Eintrag dort nötig (das script hätte sowas dann demnach mit löschen müssen) |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Es ist doch noch nicht geschafft:
Wenn man z.B. OGG verknüpft, wird es dennoch mit dem DeliPlayerII geöffnet, da es auf diesen Player zugewiesen ist. Warum ? Das geht doch so nicht :( Add: Mir ist übrigens aufgefallen, dass es nur funktioniert, wenn die entsprechende Datei im gleichen Verzeichniss liegt. Sonst beendet sich das Programm. Das kann ebenfalls nur an der Registry liegen. |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Zitat:
Du kannst es ja mal ganz einfach testen. Erstmal versuchen das Programm per [win] > Ausführen, oder über 'ne BatchFile aufrufen (dort kannst du ja beliebig angeben wo sich was befinden soll. Und dann nimm z.B. dieses Progrämmchen, benenne es so wie deine EXE und stell es an deren Stelle.
Delphi-Quellcode:
Wenn dieses den richtigen Dateinamen incl. Verzeichnis und eine Erfolgreichmeldung anzeigt, dann gibt's mit ANSI keine Probleme.
Program Project2;
{$APPTYPE CONSOLE} Var F: File; Begin WriteLn('Datei: "' + ParamStr(1) + '"'); WriteLn; AssignFile(F, ParamStr(1)); FileMode := $0040{fmOpenRead or fmShareDenyNone}; {$I-} Reset(F); {$I+} If IOResult = 0 Then WriteLn('Datei erfolgreich ge”ffnet') Else WriteLn('Zugriffsfehler'); CloseFile(F); WriteLn; WriteLn('Beenden mit ENTER'); ReadLn; End. Ich vermute mal nicht, daß du nicht mit Unicode arbeitest, also sollte dieses ausreichend sein. Die " sind auch richtig gesetzt? Zur Sicherheit müssen ja alle Pfade/Dateien darin eingeschlossen sein. Umgebungsvariablen (sowas wie %WinDir%) hast du nicht verwendet? Weil dann wäre REG_SZ falsch. |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Zitat:
Delphi-Quellcode:
var ffile, FileType : String;
ArrayIndex : Integer; begin if (ParamCount > 0) and (FileExists(ParamStr(1))) then begin ffile := ExtractFileName(ParamStr(1)); FileType := LowerCase(Trim(ExtractFileExt(ParamStr(1)))); for ArrayIndex := 0 to 13 do if FileExt[ArrayIndex] = FileType then Break; if FileType <> '' then begin case ArrayIndex of // Audio/Video 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10: begin AddSingleFile(ffile); end; // Playlist 11: begin LoadFiles(LoadM3U(ffile); end; 12: begin LoadFiles(LoadASX(ffile); end; 13: begin LoadFiles(LoadDPL(ffile, nil)); end; end; end; end; |
Re: InstallExt installiert Dateierweiterung erst nach Neusta
also warum es nur im selben Verzeichnis geht ... dat is einfach zu erklären :stupid:
mit ffile := ExtractFileName(ParamStr(1)); entfernst du die Verzeichnisangabe, weßhalb z.B. AddSingleFile(ffile); nur den Dateinamen bekommt. Daher wird die Datei im aktuellen Arbeitsverzeichnis gesucht wird, was bei dir rein zufällig das Programmverzeichnis (muß es aber nicht). Ach ja, meckert Delphi bei dir nicht bei ArrayIndex? > Variable kann nach Schleifendurchlauf undefiniert sein, oder so
Delphi-Quellcode:
Die Exception könnte zwar irgendwie durch ArrayIndex (innerhalb des Case-Blocks) hervorgerufen werden, aber bei 'nem Integer un dieser unkion eigentlich nich möglich.
var FileType: String;
ArrayIndex: Integer; begin if (ParamCount = 0) or not FileExists(ParamStr(1)) then exit; FileType := LowerCase(Trim(ExtractFileExt(ParamStr(1)))); for ArrayIndex := 0 to 13 do if FileExt[ArrayIndex] = FileType then case ArrayIndex of // Playlist 11: LoadFiles(LoadM3U(ParamStr(1))); 12: LoadFiles(LoadASX(ParamStr(1))); 13: LoadFiles(LoadDPL(ParamStr(1), nil)); // Audio/Video else AddSingleFile(ParamStr(1)); end; end; Bleibt noch die Möglichkeit, daß die Exception in einer der verwendeten Funktionen/Prozeduren auftritt, z.B. wegen des fehlenden Pfades? > LoadM3U, LoadASX, LoadDPL, LoadFiles und/oder AddSingleFile hast schonmal das Programm im Debuger durchlaufen lassen? unter Menü > Start > Parameter... bei Parameter Zitat:
|
Re: InstallExt installiert Dateierweiterung erst nach Neusta
Es gab btw. keine Exeption, das Programm hat sich schon vorher freiwillig beendet :stupid: Werde den Fehler (ExtractFileName) beseitigen :stupid:
I am so :stupid: :stupid: :stupid: :mrgreen: Thx. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:35 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 by Thomas Breitkreuz