Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi InstallExt installiert Dateierweiterung erst nach Neustart (https://www.delphipraxis.net/90068-installext-installiert-dateierweiterung-erst-nach-neustart.html)

Nils_13 11. Apr 2007 09:43


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:
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;
Ein Aufrufbeispiel:
Delphi-Quellcode:
InstallExt('.asd', 'asd irgendetwas', 'asd irgendetwas', 'asd.exe', '"%1"', 'asd.ico' , 0);

mirage228 11. Apr 2007 09:46

Re: InstallExt installiert Dateierweiterung erst nach Neusta
 
Hi,

Nach dem Setzen der Dateierweiterungen ruf einfach dieses hier auf
Delphi-Quellcode:
// uses ShlObj oder ShellAPI musst mal schauen
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
Das sollte klappen.


mfG
mirage228

Nils_13 11. Apr 2007 10:03

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:
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';
Nun zur eigentlichen Registration:
Delphi-Quellcode:
if InstallExt(Ext, ExtDes, FileDes, Prg, '"%1"', Ico , 0) then // Ico = Pfad+Dateiname
  SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil)
else
  MsgBox(...);
In der Registry steht daraufhin im Schlüssel .asx der Eintrag DefaultIcon, welcher den Pfad zum Icon enthält.
Unter .asx\Shell\Open\Command steht nun im Schlüssel Standard:
Zitat:

"E:\Eigene Projekte\DarkPlayer New\Tools\FileManager\DarkPlayerII.exe" ""%1""
In dem eben genannten Schlüssel muss irgendein Fehler liegen. Sind dort vlt. zwei Anführungszeichen bei %1 zu viel ?

mirage228 11. Apr 2007 10:09

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

himitsu 11. Apr 2007 11:17

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.

Christian Seehase 11. Apr 2007 12:09

Re: InstallExt installiert Dateierweiterung erst nach Neusta
 
Moin Nils,

So rufst Du die Registrierung auf:

Delphi-Quellcode:
if InstallExt(Ext, ExtDes, FileDes, Prg, '"%1"', Ico , 0) then
und das macht die Funktion damit:
Delphi-Quellcode:
Reg.WriteString('', Format('"%s" "%s"', [OpenWith, ParamString]));
=> warum übergibst Du also %1 in ""?

himitsu 11. Apr 2007 12:35

Re: InstallExt installiert Dateierweiterung erst nach Neusta
 
Zitat:

Zitat von Christian Seehase
So rufst Du die Registrierung auf:
...
und das macht die Funktion damit:
...
=> warum übergibst Du also %1 in ""?

Mir fällt grad ein ... dieses, oder zumindestens ein ähnliches Problem gab's schon mal.


Die "richtige" Lösung wäre da eigentlich
Code:
Reg.WriteString('', Format('"%s" [color=#ff0000]%s[/color]', [OpenWith, ParamString]));
und den Aufruf so lassen.

Denn was ist, wenn man mal mehrere Parameter haben möchte?

Nils_13 12. Apr 2007 09:17

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:

"E:\Eigene Projekte\DarkPlayer New\Tools\FileManager\DarkPlayerII.exe" "%1"
Es wundert mich, dass es immer noch nicht mit meinem Programm geöffnet wird, da in .asx in Standard .ASX playlist steht.

Woran könnte das liegen ?

himitsu 12. Apr 2007 10:11

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)

Nils_13 12. Apr 2007 15:15

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.

himitsu 12. Apr 2007 15:57

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.

Nils_13 12. Apr 2007 16:18

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.

himitsu 12. Apr 2007 17:03

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.

Nils_13 12. Apr 2007 18:06

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.

himitsu 13. Apr 2007 09:05

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 .....

Nils_13 13. Apr 2007 09:48

Re: InstallExt installiert Dateierweiterung erst nach Neusta
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Wirklich nicht 13?
Nein und das hat auch nichts mit dem Alter zu tun. Wenn man vorher noch nicht viel mit der Registry zu tun hatte....

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.

himitsu 13. Apr 2007 10:17

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)

Nils_13 13. Apr 2007 10:31

Re: InstallExt installiert Dateierweiterung erst nach Neusta
 
Ich habe deine Datei geöffnet, aber ASX wird weiterhin mit dem Standardprogramm geöffnet.

himitsu 13. Apr 2007 10:44

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?

Nils_13 13. Apr 2007 10:57

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!!

himitsu 13. Apr 2007 11:03

Re: InstallExt installiert Dateierweiterung erst nach Neusta
 
Zitat:

Zitat von Nils_13
Das hat mir nicht viel gebracht, da ich somit noch nicht wusste, ob mein Programm für Dateizuweisungen funktioniert oder nicht.

Also dieser Dialog richtet den Eintrag für dein Programm ganz normal ein und als erster/einziger Parameter wird dann die entsprechende Datei übergeben.



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)

Nils_13 13. Apr 2007 20:19

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.

himitsu 17. Apr 2007 13:10

Re: InstallExt installiert Dateierweiterung erst nach Neusta
 
Zitat:

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.
Also das es nur geht, wenn Datei und Zielprogramm im selben Verzeicnis sind, daß kann eigentlich nicht an der Registry liegen, denn der Explorer ließt dort immer den gleichen Wert aus und übergibt alles auf die selbe Art, egal wo sich Programm und Datei befinden.

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:
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.
Wenn dieses den richtigen Dateinamen incl. Verzeichnis und eine Erfolgreichmeldung anzeigt, dann gibt's mit ANSI keine Probleme.
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.

Nils_13 17. Apr 2007 16:02

Re: InstallExt installiert Dateierweiterung erst nach Neusta
 
Zitat:

Datei: "E:\Musik\irgendwas.ext"
Datei erfolgreich geöffnet
Diese Meldung erhalte ich mit Öffnen Mit und Doppelklick. Nun müsste der Fehler im Code meines zugewiesenen Programms liegen. Ich sehe keinen Fehler, der gleich einen Programmabsturz verursachen könnte, erst recht nicht, dass es nur im Programmverzeichniss funktioniert:
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;

himitsu 17. Apr 2007 16:30

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:
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;
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.

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:

"E:\Musik\irgendwas.ext"
eintragen und dann in Ruhe testen.

Nils_13 17. Apr 2007 16:39

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 16:08 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