Jak skojarzyć moją aplikację z rozszerzeniem danego typu

Adam Boduch

Trzeba dodać odpowiednie klucze do rejestru. Np. jeżeli chcesz skojarzyć swój program z plikiem *.txt to musisz dodać wartość do klucza w rejestrze.

var Reg : TRegistry;
begin
try
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_CLASSES_ROOT;
  Reg.OpenKey('txtfile\shell\open\command', True);
  Reg.WriteString('',Application.ExeName + ' "%1"');
  Reg.CloseKey();
finally
  Reg.Free;
end;
end;

Jeżeli chcesz zarejestrować swoje rozszerzenie i otwierać w swoim programie musisz zrobić tak samo tylko trochę inaczej :-)

Np.

var ExtMyFile : String; //rozszerzenie naszego pliku
    Reg : TRegistry;
begin
//teraz rejestrujymy swoje rozszerzenie
//Najpierw podajemy nazwę rozszerzenia
ExtMyFile := 'xyz'; //to tak dla przykładu, może być zupełnie coś innego i 
                    //nie koniecznie 3 literki

//Teraz definiujemy to rozszerzenie w rejestrze
try
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_CLASSES_ROOT;
  Reg.OpenKey('.' + ExtMyFile, True); //tworzy klucz w rejestrze o nazwie dla nas np ".xyz"
  Reg.WriteString('', AnsiUpperCase(ExtMyFile) + 'file'); //tworzy wartość zawierajaca
                                                   //nazwe klucza w rejestrze gdzie bedą 
                                                   //znajdowały się dane na
                                                   //temat naszego pliku dla nas "XYZfile"
  Reg.CloseKey();  //zamykamy ten klucz i idziemy dalej


  Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file', True); //tworze powyższy klucz

  //teraz podaje opis naszego pliku
  Reg.WriteString('','Plik programu ...'); //w miejsce kropek podajesz nazwę swojego programu
  Reg.CloseKey();  //zamykamy ten klucz i idziemy dalej

  //teraz przypisujemy plikowi ikonę
  Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\DefaultIcon', True);
  Reg.WriteString('',Application.ExeName + ',0'); //gdzie Application.ExeName to scieżka
                                                 //do pliku zawierającego ikonę w tym
                                                 //przypadku w tym przypadku jest to
                                                 //nazwa i ścieżka do Twojego
                                                 //programu ale może być to równie
                                                 //dobrze ścieżka do innego programu,
                                                 //ścieżka do ikony czy ścieżka
                                                 //do jakiejś biblioteki zarówno DLLki
                                                 //jak i ICLki a 0 to nr ikony, jeżeli
                                                 //plik ma więcej ikon nr może być inny
  Reg.CloseKey();  //zamykamy ten klucz i idziemy dalej

  //teraz tworzymy możliwość otwierania pliku w naszym programie
  Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\open', True);
  Reg.WriteString('','&Otwórz'); //etykieta pozycji w menu kontekstowym
  Reg.CloseKey();
  Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\open\command', True);
  Reg.WriteString('',Application.ExeName + ' "%1"');
  Reg.CloseKey();

  //lub ewentualnie  pozycje EDYTUJ w menu kontekstowym naszego pliku
  Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\edit', True);
  Reg.WriteString('','&Edytuj');
  Reg.CloseKey();
  Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\edit\command', True);
  Reg.WriteString('',Application.ExeName + ' "%1"');
  Reg.CloseKey();

  //lub jeżeli chcemy otwierać nasze pliki typu np XYZ w jeszcze innym programie
  Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\Open2', True);
  Reg.WriteString('','Otwórz &używając ...'); //w miejsce kropek nazwa innego programu
  Reg.CloseKey();
  Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\Open2\command', True);
  Reg.WriteString('',........ + ' "%1"'); //w miejsce kropek ścieżka do innego programu
  Reg.CloseKey();

  //na tej podstawie można dodawać wiele pozycji do menu kontekstowego
  //naszego pliku

  //może tam być również DRUKUJ
  //przykład dla dowolnego programu
  Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\printin, True);
  Reg.WriteString('',&Drukuj w ...'); //pozycja w menu kontekstowym
                                      //a w miejsce kropek nazwa programu
  Reg.CloseKey();
  Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\printin\command', True);
  Reg.WriteString('',........ + ' /p "%1"'); //w miejsce kropek ścieżka do programu
                                             //drukującego przy czym program wywoływany
                                             //jest z parametrem /p - oznaczającym
                                             //drukowanie więc program musi obsługiwać
                                             //taki parametr
  Reg.CloseKey();



  //przykład dla drukowania w NOTATNIKU
  Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\printin, True);
  Reg.WriteString('',&Drukuj w Notatniku'); //pozycja w menu kontekstowym
                                      //a w miejsce kropek nazwa programu
  Reg.CloseKey();
  Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\printin\command', True);
  Reg.WriteString('','%SystemRoot%\system32\NOTEPAD.EXE /p %1');
  //powyższa linia zawiera ścieżkę dostępu do Notatnika, jest ona poprawna
  //dla Win NT (2000 i XP). Dla Win 9x i Me powinno być
  //Reg.WriteString('','C:\Windows\NOTEPAD.EXE /p %1');
  Reg.CloseKey();

finally
  Reg.Free;
end;

end;

To by było na tyle. Jeżeli będą jakieś niejasności proszę wstawiać odpowiednie zapytania w komentarzach a ja w miarę możliwości postaram się na nie odpowiedzieć.
Powyższy przykład był pisany z głowy, na sucho. Nie był przetestowany w Delphi i może zawierać błędy.
Czekam na opinie

Polecam poczytanie artykułu Rejestry systemu Windows w dziale Delphi.

5 komentarzy

No taki tam gotowiec :P

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, registry;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);var reg: TRegistry;
begin
  Reg.RootKey := HKEY_CLASSES_ROOT;
  Reg.OpenKey(
  \'txtfileshellopencommand\', True);
  Reg.WriteString(\'\', \'\"\'+ Application.ExeName + \'\" \"%1\"\');
end;

end.

A i wybacz adam ze wstawilem twoja procedurkę :D

No i znowu odsyłasz nas do innych artykółów.. OJOJOJ
i zapominasz o znacznikach < delphi >< /delphi >
:P

coś tu mi nie gra

Cholera, a jeżeli program ma swój własny typ plików i potrzzeba autoryzacji?

Dlaczego wyskakuje mi access violation?