[ Ilija Studen @ 01.06.2003. 20:46 ] @
Kako da asociram neke ekstenzije sa svojim programom i kako da nateram porgram da se pokrene i otvori neki fajl kad neko dva put klikne na njegovu ikonu?

Znate ono: stoji Word fajl, ja dva puta kliknem na njega, pokrene se word i otvori fajl =]
[ Zekica @ 03.06.2003. 20:39 ] @
Teorija:
Windows čuva asocijacije tipova file-ova u registry-ju, i to u HKEY_CLASSES_ROOT.
tu se nalaze mnoge stvari (koje možeš videtu iz regedit-a), a među njima i dve bitne za
ovaj problem:

1. Pod-kljucevi .ext - u njima se nalazi samo jedan default-value sa imenom pod-ključa, koji
odredjuje sve ostalo.

Npr:
ključ .txt sadrži vrednost txtfile.
postoji ključ txtfile u kome su sva ostala podesavanja.

Note: Ovo je uradjeno iz samo jednog razloga:
vise tipova file-ova može da otvara isti program...


2. Pod-ključevi npr txtfile - u njima se nalaze sve informacije o ikonici, programu koji otvara file...

U ovom kjuču se nalaze mongi podključevi, od kojih su najvažniji:
DefaultIcon, koji određuje ikonu file-a

DefaultIcon ključ sadrži default value koji predstavlja ime ikone file-a
u formatu: \path\to\file.ext, iconindex

primer: C:\Windows\notepad.exe,1


Shell, koji određuje koje akcije mogu da se rade nad file-om, koji program uporebiti...

Shell ključ sadrži kao default value ime pod-ključa, koji je podrazumevana akcija (open ako je izostavljeno), i pod-ključeve sa akcijama koje mogu da se primene nad tim file-om.
Npr: open, print...

Bilo koji od ovih, recimo open sadrži kao default value ime akcije, koje će biti prikazano u meniju, kada se na file klikne desnim tasterom, i još neke pod-ključeve, od koji je najbitniji:
command - koji kao default value sadrži program koji treba da se izvrši:

primer: C:\Windows\notepad.exe "%1"

dakle ovako:

Code:

HKEY_LOCAL_MACHINE
    .txt
        (Default)=txtfile
    txtfile
        (Default)=Fajl sa tekstom
        DefaultIcon
            (Default)=C:\Windows\notepad.exe,1
        Shell
            (Default)=print
            open
                (Default)=Otovri ovaj file
                command
                    (Default)=C:\Windows\notepad.exe "%1"
            print
                (Default)=Odstampaj ovaj file
                command
                    (Default)=C:\Windows\notepad.exe /p "%1"

Ovo je samo primer, moglo je i drugacije...


Izvinjavam se na dugom postu, ali to je bilo potrebno objasniti.
Ovo, predpostavljam da nisi baš razumeo, mada ne znam... :-)

Praksa:
Evo ipak malo koda, koji će uraditi gore pomenuto...

Ovako, prvo treba ubaciti unit za rad sa registry-jem:
Code:

uses ..., Registry;


Onda, treba negde ubaciti proceduru (samo primer):

Code:

procedure TForm1.Button1Click(Sender: TObject);
var reg: TRegistry;
begin
reg:=TRegistry.Create;
reg.RootKey:=HKEY_CLASSES_ROOT;
reg.OpenKey('.ext',true);
reg.WriteString('','extfile');
reg.CloseKey;
reg.OpenKey('extfile',true);
reg.WriteString('','Ovo je file .EXT');
reg.CloseKey;
reg.OpenKey('Prgname.Extenzija\DefaultIcon',true);
reg.WriteString('','C:\path\to\icon.exe, 0');
reg.CloseKey;
reg.OpenKey('Prgname.Extenzija\Shell',true);
reg.WriteString('','Open');
reg.CloseKey;
reg.OpenKey('Prgname.Extenzija\Shell\Open',true);
reg.WriteString('','Otvori ovaj file');
reg.CloseKey;
reg.OpenKey('Prgname.Extenzija\Shell\Open\command',true);
reg.WriteString('','C:\path\to\exe.exe "%1"');
reg.CloseKey;
reg.Destroy;
reg.OpenKey('Prgname.Extenzija\Shell\Print',true);
reg.WriteString('','Otvori ovaj file');
reg.CloseKey;
reg.OpenKey('Prgname.Extenzija\Shell\Print\command',true);
reg.WriteString('','C:\path\to\exe.exe /p "%1"');
reg.CloseKey;
reg.Destroy;
end;


Nadam se da je jasno, i unapred se izvinjavam, ako je ovo bilo dosadno, ali mislim da je vredelo...

Pozdrav.
[ silverglider @ 03.06.2003. 23:07 ] @
http://msdn.microsoft.com/libr.../shell_adv/registeringapps.asp


Ima dosta zanimljivih stvari u MSDN-u, a postoji i online verzija na:
http://msdn.microsoft.com/library/default.asp
[ Ilija Studen @ 08.06.2003. 01:13 ] @
OK, asocijaciju sam odradio, medjutim, imam drugi manji problem: koju poruku i kako da obradim da bi se asocirani fajl otvorio u mom programu kada dva puta kliknem na njega ili odaberem svoj program iz OpenWith liste? Pregledao sam neki kod i uspeo da ga nateram da radi to, medjutim, problem je sto moje resenje radi samo kad je bar jedna instanca programa pokrenuta (deo koda preuzet iz JEDIEdit projekta).

Najsimpaticnija stvar je sto su neke stvari koje se korisnicima cine izuzetno logicnim (gornji primer) ponekad prava glavolomka za programera!!! =]
[ Crazy Mix @ 29.06.2003. 13:30 ] @
Nisam te razumeo bas najbolje, ali ovaj kod ti je podrska za Open With/2xLk

Code:
if paramstr(1)<>'' then begin
//kod ucitavanja
memo1.lines.loadfromfile(paramstr(1)); //primer, mozes uraditi sta zelis
end;


Jah rastafari!