[Delphi] Przyporządkowanie plików aplikacji

0

Chcę zrobić, żeby pliki o danym rozszerzeniu były domyślnie otwierane za pomocą mojego programu. Tylko że muszą się otwierać w istniejącej już kopii programu. Znalazłem coś takiego na delphi-area ( http://www.delphi-area.scrypty.com/Faq/Odp/41.htm ), i napisałem na podstawie tego własną procedurkę (tamta nie chciała się skompilować). Tylko, że dalej otwiera pliki w nowych kopiach programu :(. Co robię źle?---------------------------
Delphi 6

Pozdrówka

0

A procedura to:

procedure zarejestruj(Rozszerzenie, Opis, Ikona, Sciezka:String);
var
reg:tregistry;
begin

reg:=tregistry.Create;
reg.RootKey:=HKEY_CLASSES_ROOT;
reg.OpenKey('.'+Rozszerzenie, true);
reg.WriteString(`, rozszerzenie+'_file');
reg.CloseKey;

reg.OpenKey(rozszerzenie+'_file', true);
reg.WriteString(`, Opis);
reg.CloseKey;

reg.OpenKey(rozszerzenie+'_file\DefaultIcon', true);
reg.WriteString(`, Ikona);
reg.CloseKey;

reg.OpenKey('\'+rozszerzenie+'_file\shell\open\command', true);
reg.WriteString(`, sciezka);
reg.CloseKey;

reg.OpenKey('\'+rozszerzenie+'_file\shell\open\ddeexec\Application', true);
reg.WriteString(`, 'CoolPlayer');
reg.CloseKey;

reg.OpenKey('\'+rozszerzenie+'_file\shell\open\ddeexec', true);
reg.WriteString(`, '');
reg.CloseKey;

reg.free;
end;

Delphi 6

Pozdrówka

0

Mam wrażenie, że problem tkwi w tym iż nie rejestrujesz swojej aplikacji jako rozszerzenia shella. Owszem kojarzysz rozszerzenie pliku z programem, ale ponieważ
shell nie ma sposobu komunikacji z twoją aplikacją, co pozwala mu stwierdzić czy dana aplikacja jest już uruchomiona i czy potrawi otworzyć nowy plik w tym samym procesie czy też nie, to po prostu tworzy nowy proces do obsługi nowego pliku. Zupełnie tak samo jak jest np. z notatnikiem. Żeby natomiast zarejestrować twoją aplikację jako rozszerzenie Shella musiałbyć zaimplementować w niej interface IShellExtension, a samą aplikację zarejestrować w systemie jako OleServer. Jest to
dość ciężkie do zgryzienia jeśli się nie ma doświadczenia w tym temacie. Ja zdołałem
jedynie przeczytać kilka rozdziałów w SDK i się poddałem.

Pozdrowienia {hello} --Michał
TJS group
delphi 5,6
" Praktyka - to jest wtedy gdy wszystko działa lecz nikt nie wie dlaczego
Teoria - jest wtedy gdy nic nie działa ale wszyscy wiedzą dlaczego,
My łączymy teorię z praktyką
NIC NIE DZIAŁA I NIKT NIE WIE DLACZEGO "

0

Da się to zrobić bez SDK.

W procedurze rejestrującej dodaj:

Reg.OpenKey(root '\ddeexec', True);
Reg.WriteString(, '[open(%1)]'); Reg.OpenKey(root '\\ddeexec\\Application', True); Reg.WriteString(, 'MojProgram');
Reg.OpenKey(root '\ddeexec\Topic', True);
Reg.WriteString('', 'MojProgram');

gdzie root='\' rozszerzenie' '_file\shell\open'.

Wrzuć teraz na formę kontrolki

TDDEServerConv i nazwij ją MojProgram. Wrzuc TDDEServerItem i ustaw ServerConv na MojProgram.

Teraz zdarzenie MojProgram.OnExecuteMacro:

begin
s:=Msg[0];
if Pos('open', s) &gt 0 then begin
s:=Copy(s, 7, Length(s) - 9);
//teraz otwórz plik s
end
end

W razie problemów pisz.
--Vogel [Delphi 6 PE]

I TY możesz nauczyć się grać w bierki!

0

Sprytne Vogel! {brawo}
A jak z funkcjonowaniem tego pod różnymi OS?
Ja robiłem instlatora w oparciu o DDE i w Windows ME się wyburaczyło.
--Michał
TJS group
delphi 5,6
" Praktyka - to jest wtedy gdy wszystko działa lecz nikt nie wie dlaczego
Teoria - jest wtedy gdy nic nie działa ale wszyscy wiedzą dlaczego,
My łączymy teorię z praktyką
NIC NIE DZIAŁA I NIKT NIE WIE DLACZEGO "

0

Wielkie dzięki, zadziałało.---------------------------
Delphi 6

Pozdrówka

1 użytkowników online, w tym zalogowanych: 0, gości: 1