Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dateiendung .mp3 Registrierung klappt nicht! (https://www.delphipraxis.net/19766-dateiendung-mp3-registrierung-klappt-nicht.html)

dadu 8. Apr 2004 14:34


Dateiendung .mp3 Registrierung klappt nicht!
 
Hi Leute.
Will die Dateiendung .mp3 mit meinem Programm und meinem ICON verknüpfen
[Wenn man also eine mp3 im Explorer sieht, hat diese mein Icon; bei doppelklick wird mein Programm geöffnet!]

Hab mir auch aus dem Netz folgenden Code geholt:
Code:
function tmainform.InstallExt(Extension, ExtDescription, FileDescription,
  OpenWith, ParamString: string; IconIndex: Integer): Boolean;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    with Reg do
    begin
      RootKey := HKEY_CLASSES_ROOT;
      OpenKey(Extension, True);
      WriteString('', ExtDescription);
      OpenKey('\' + ExtDescription, True);
      WriteString('', FileDescription);
      OpenKey('DefaultIcon', True);
      WriteString('', OpenWith + ',' + IntToStr(IconIndex));
      OpenKey('\' + ExtDescription + '\Shell\Open\Command', True);
      WriteString('', '"' + OpenWith + '" "' + ParamString + '"');
    end;
    Result := True;
  except
    Result := False;
  end;
  Reg.Free;
end;



der hat auch immer funktioniert, doch wenn ich jetzt den MS Mediaplayer oder Winamp starte, und diese dann sofort .mp3 mit sich selbst wieder verknüpfen, funzt der Code nicht mehr( Bei erneutem Öffnen meines Programms und ausführen der oben genannten Routine!)

Also: Was machen die großen Player, damit ihr ICON sofort angezeigt wird, und das jede mp3 mit dem jeweiligen Player geöffnet wird???

DaDu

S2B 8. Apr 2004 15:51

Re: Dateiendung .mp3 Registrierung klappt nicht!
 
Also ich hätte das so gemacht:
Delphi-Quellcode:
   
  regist:=TRegistry.Create;
  With regist do
  try
    RootKey:=HKEY_CLASSES_ROOT;
    OpenKey('.mp3', true);
    WriteString('', 'Programmname');
    CloseKey;
    OpenKey('Programmname', true);
    WriteString('', 'MP3-Datei');
    OpenKey('DefaultIcon', true);
    WriteString('', 'Pfad zum Icon');
    CloseKey;
    OpenKey('Programmname\Shell\Open', true);
    WriteString('', 'Mit Programm öffnen');
    CloseKey;
    OpenKey('Programmname\Shell\Open\Command', true);
    WriteString('', '"Pfad zur exe-Datei" "%1"');
    CloseKey;
  finally free;
  end;
Gruß
S2B :dance:

MathiasSimmack 8. Apr 2004 19:06

Re: Dateiendung .mp3 Registrierung klappt nicht!
 
Zitat:

Zitat von S2B
Also ich hätte das so gemacht:

Und was ist da jetzt anders dran?

Zitat:

Zitat von dadu
Was machen die großen Player, damit ihr ICON sofort angezeigt wird, [...]

Delphi-Quellcode:
SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST,nil,nil);
Zitat:

[...] und das jede mp3 mit dem jeweiligen Player geöffnet wird???
Schätzungsweise wird´s eine Option geben, mit der das Programm die Endung sofort wieder auf sich registriert wenn das nicht der Fall ist. Gibt´s ja beim IE bspw. auch, aber der fragt zumindest nach ob er sich wieder als Standard eintragen soll.

Im Prinzip müsstest du also auch so rabiat sein und die Endung immer wieder auf dein Programm registrieren. Mach´s aber abschaltbar, so dass der User noch die Wahl hat. ;)

dadu 9. Apr 2004 10:21

Re: Dateiendung .mp3 Registrierung klappt nicht!
 
@MathiasSimmack

Was macht "SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST,ni l,nil);"?

Also hab das mal eingebunden, hat aber nicht das Icon meines Programms mit der Endung .mp3 verknüpft.

@alle

Hab wohl das zentrale Problem gefunden!:
In der registry ist mit meiner procedure alles geändert, aber es gibt unter Windows noch eine Funktion ("Systemsteuerung/Ordneroptionen/Dateitypen") dort kann man auch ein Programm einer Endung zuordnen! Und das hatte ich auch gemacht, nämlich dem MS Mediaplayer.
Problem: Wenn man dort das Programm ändert wird nicht der bekannte registry-Pfad aus meiner Procedure geändert=> Es gibt noch einen anderen Ort, wo Windows Datei-Endungs-Verknüpfungen speichert! (Nur wo?)

PS: Diese Sytemsteuerungs-Einstellung steht wie's aussieht auch über der Standart registry Einstellung(Windows ignoriert deshalb den Eintrag durch meine Procedure)

DADU

S2B 9. Apr 2004 11:02

Re: Dateiendung .mp3 Registrierung klappt nicht!
 
Zitat:

Zitat von MathiasSimmack
Zitat:

Zitat von S2B
Also ich hätte das so gemacht:

Und was ist da jetzt anders dran?

Ich hab gedacht, dass das ganze irgendwie gar nicht funktionieren dürfte :wall:, weil ja die geöffneten Keys gar nicht mehr geschlossen werden (mit "CloseKey;"). Kann mir vielleicht jemand erklären, warum das trotzdem funktioniert?

Gruß
S2B :dance:

Christian Seehase 9. Apr 2004 11:38

Re: Dateiendung .mp3 Registrierung klappt nicht!
 
Moin S2B,

Zitat:

Zitat von S2B
Kann mir vielleicht jemand erklären, warum das trotzdem funktioniert?

Weil der Wert sofort beim Write in die Registry geschrieben wird.
Durch das Schliessen des Handels wird "lediglich" die Resource wieder freigegeben (und sollte deswegen auch auf jeden Fall gemacht werden. Stichwort Resourcenschutzblock)

MathiasSimmack 9. Apr 2004 13:02

Re: Dateiendung .mp3 Registrierung klappt nicht!
 
Zitat:

Zitat von dadu
@MathiasSimmack

Was macht "SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST,ni l,nil);"?

Na, ich habe auf deine Frage geantwortet.
Zitat:

Was machen die großen Player, damit ihr ICON sofort angezeigt wird [...]
:roll:

Zitat:

Also hab das mal eingebunden, hat aber nicht das Icon meines Programms mit der Endung .mp3 verknüpft.
Wie könnte es auch, wo das doch mit der Registry gar nichts zu tun hat.

dadu 9. Apr 2004 13:56

Re: Dateiendung .mp3 Registrierung klappt nicht!
 
Hab die Antwort selbst gefunden:

Benutzt folgenden Code und ihr setzt euch gegen alle großen Programme durch

Überall wo "DaDuMediaPlayer5" muss dann euer Name rein
Delphi-Quellcode:


     function tmainform.InstallExt(Extension, ExtDescription, FileDescription,
  OpenWith, ParamString: string; IconIndex: Integer): Boolean;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    with Reg do
    begin
   
 //Normale Teil
      RootKey := HKEY_CLASSES_ROOT;
      OpenKey(Extension, True);
      WriteString('', ExtDescription);
      OpenKey('\' + ExtDescription, True);
      WriteString('', FileDescription);
      OpenKey('DefaultIcon', True);
      WriteString('', OpenWith + ',' + IntToStr(IconIndex));
      OpenKey('\' + ExtDescription + '\Shell\Open\Command', True);
      WriteString('', '"' + OpenWith + '" "' + ParamString + '"');
   
 //Neu Teil

      RootKey := HKEY_Current_User;
      OpenKey('Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\',
        True);
      if KeyExists('.mp3') then DeleteKey('.mp3');
      RootKey := HKEY_Local_Machine;
      OpenKey('\Software\Classes\DaDuMediaPlayer5\DefaultIcon', true);
      WriteString('', Application.ExeName + ',' + IntToStr(1));//Pfadname+ Iconindex
      OpenKey('\Software\Classes\DaDuMediaPlayer5\Shell\Open\Command', true);
      WriteString('', '"' + Application.ExeName + '" "' + '%1' + '"');
      OpenKey('\Software\Classes\.mp3', true);
      WriteString('', 'DaDuMediaPlayer5');
      OpenKey('\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3', True);
      WriteString('', 'DaDuMediaPlayer5');
      SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);// aktuallisiert die Icons
    end;
    Result := True;
  except
    Result := False;
  end;
  Reg.Free;
end;
Funzt perfekt!
Hab mir einfach mal angeguckt wo Windows dieses Öffnen mit aus der Systemsteuerung in der registry speichert

Zitat:

Stichwort Resourcenschutzblock
Was ist das?

Christian Seehase 9. Apr 2004 14:08

Re: Dateiendung .mp3 Registrierung klappt nicht!
 
Moin dadu,

Zitat:

Zitat von dadu
Zitat:

Stichwort Resourcenschutzblock
Was ist das?

Lustig, das Ende des Satzes ist Dir aufgefallen, der Anfang nicht ;-)

Vorweg: Benutzt hast Du ihn sogar, nämlich im Zusammenhang mit dem Registry Objekt

Allgemein sieht der so aus:

Delphi-Quellcode:
<Resource belegen>
try
  <Mit der Resource arbeiten>
finally
  <Resource freigeben>
end;
Wo Du es vergessen hast:
Bei diversen OpenKey Zeilen.
Zu jedem OpenKey gehört auch ein CloseKey, da hier jedesmal eine Resource in Form eines Handles belegt wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:48 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