Instalatory

Adam Boduch

Temat instalatorów jest bardzo ciekawy. Bo któż nie chciałby mieć własnego instalatora? Pewnie każdy. W tym artykule przedstawię proces pisania instalatora bez wykorzystania dodatkowych komponentów. Nie będzie to instalator w stylu "Install Shield", ale taki na własny użytek, do własnych celów.

Zacznijmy więc. Wygląd samego instalatora zależy już od Ciebie i od Twojego gustu. Oczywiście nasz instalator ma być w jednym pliku tak żeby nasz instalowany program "odklejał" się od EXEka i zapisywał w wybranym przez użytkownika katalogu.
Pewnie największym problemem było włączenie samego pliku do EXEka, prawda?

Krok 1. Dołączanie plików

Przygotuj sobie najpierw jakiś katalog - załóżmy "Setup". Tam skopiuj pliki, które chcesz włączyć do EXEka. Ja w swoim przykładzie włączam tylko jeden plik wykonywalny EXE. Naszym celem będzie stworzenie zasobu zawierającego właśnie plik EXE, który chcesz zainstalować. W przykładzie, który podaje plik dołączony do zasobów nazywać się będzie "Pad.exe". Najpierw stwórz plik tekstowy z zmień jego rozszerzenie na *.rc ( np. files.rc ). W Notatniku dopisz taką linię:

PAD RCDATA "Pad.exe"
Pierwszy człon to nazwa programu, drugi to typ pliku - w tym wypadku jest to program, a ostatni człon podany w cudzysłowach to nazwa pliku wykonywalnego - w moim przypadku jest to "Pad.exe". Zapisz cały plik. Jeżeli posiadasz Delphi to z pewnością program "brcc32.exe". Znajduje się on w katalogu ...Delphi\Bin. Skopiuj go do katalogu z Twoimi plikami ( tam gdzie masz plik *.rc ).
Jest to program DOS-owy więc musisz uruchomić go z okienka MS -DOS. Ten program przekształci plik *.rc na *.res.
Odpal więc okienko MS - DOS-a i przejdź do katalogu z plikiem *.rc oraz z programem "brcc32.exe". W DOS-ie do katalogów przechodzi się poleceniem:

cd NazwaKatalogu
Jeżeli chcesz przejść o katalog wyżej to stosujesz polecenie:

cd..
A więc jeżeli już jesteś w tym katalogu to wpisz taką linię i wciśnij ENTER:

brcc32.exe files.rc
"Files.rc" to nazwa Twojego zasobu. Jeżeli wszystko pójdzie dobrze to obok pliku *.rc powinieneś ujrzeć plik z rozszerzeniem *.res.( w moim przypadku jest to plik o nazwie "files.RES". ). Gratulacje! Właśnie stworzyłeś zasób, który zawiera Twój plik EXE. Jest on zapewne dość duży ( w moim przypadku zajmuje 250 kB ).

Krok 2. Tworzenie instalatora

Teraz musisz w Delphi zrobić instalator. Postaw parę komponentów, walnij jakiś napis.

Krok 3. Wyciągnięcie programu z EXE-ka

Gdzieś w kodzie Twojego instalatora umieść taką linię:
{$R FILES.RES}

"Files.res" to Twoja nazwa zasobu. Od tej pory zasoby te są włączone do instalatora.
Pozostało jeszcze napisanie samej procedury, która wyciągnie z zasobów program i zapisze go gdzieś na dysku:

Wygląda ona tak:

var
  Res : TResourceStream;
begin
  Res:=TResourceStream.Create(hInstance, 'PAD', RT_RCDATA);
  Res.SaveToFile('Pad.exe');
  Res.Free;

Pierwsza linia powoduje stworzenie zasobu i wyciągnięcie z niego Twojego programu, kolejna zapisuje go na dysku, a ostatnia zwalnia pamięć.

To wszystko!

29 komentarzy

A z tymi folderami to możesz wpakować wszystkie pliki które chcesz wrzucić, a potem w jakimś wątku najpierw stworzyć folder funkcją
CreateDirectory();
i dopiero potem wrzucać pliki do tego folderu.

Ja to {$ plik.RES} daje zawsze w sekcji interface, zaraz przed słowem implementation,i zaraz po deklaracji globalnych zmiennych i stałych.

Witajcie. Postaram się opisać problemy. Więc:
{$R FILES.RES}
dajemy pod
{$R *.dfm}

Plik *.rc i *.rec dajemy do delphi7/bin.

Powinno działać.

A teraz moje pytanie:
Jak już wspominałem, plik *.rc i *.rec kopiujemy do pliku w delphi. Mi ładnie działa program, jeżeli odpalam go przez delphi. Jeżeli już stworzę "Project" lub odpalę program na innym komputerze to wyskakuje błąd:
"resource cos not found"
Jak zrobić, aby ten plik *.rec można było odczytać nawet, jeżeli nie jest w folderze w delphi?

Pozdrawiam
Wowol

tomalla, nie da się folderów dodawać, ale zawsze można spakować zipem a potem jakimś komponentem zdekompresować

Super... Właśnie myślałem o instalatorze. Wkrótce w dziale Download znajdziecie nową wersję mojej przeglądarki internetowej z instalatorem :)

znaczy przestało ...

a mi działało, ale później także nie przestało działać :P

u mnie nie czyta pliku files pomórzcie

A jak do *.rc dodawać foldery?

A jak do *.rc dodawać nie pliki, tylko foldery, z plikami?

A nie lepiej byłoby zrobić tak:
Napisać instalator który by tylko kopiował?
To by było tak:
edit i button - w edicie wpisuje sie ścieżke, button kopiuje plik do miejsca gdzie prowadzi ścieżka.
Ale żeby t było w jednym pliku trzeba spakować to np. winrarem:
Wykonalny plik,
rozpakować do tempa,
po rozpakowaniu uruchomić instalator.

A nie lepiej byłoby zrobić tak:
Napisać instalator który by tylko kopiował?
To by było tak:
edit i button - w edicie wpisuje sie ścieżke, button kopiuje plik do miejsca gdzie prowadzi ścieżka.
Ale żeby t było w jednym pliku trzeba spakować to np. winrarem:
Wykonalny plik,
rozpakować do tempa,
po rozpakowaniu uruchomić instalator.

po uses wpisz linijke

const
{tu trzeba cos wpisac bo mi zawsze wywala blad wiec wpisuje np.}
A='cus zbednego';
{$R FILES.RES}

i gra muza :D

u mnie jak che wyjąć plik z zasobu, to mi wyskakuje "resource AKTUALIZACJA not found". Co robić?

mi wszystko działa super

a jak zrobić zeby uzytkownik sam mógł podać miejsce gdzie chce zainstalować program ?? aha i jak dodać np do instalatora np.ikonke jakąś chodzi mi oto ze oprucz pad.exe dodać jeszcze ikona.ico ??

Ja korzystam z Delphi 3 i brcc32.exe skopiowany do innego katalogu nie przetwarza pliku *.rc na *.res, ale gdy w moim folderze utworzę sobie skrót do brcc32 i przeciągnę na niego plik *.rc - tak jak to podał poprzednik - wtedy gra muzyka.

Ale po co bawić się w uruchamianie brcc32.exe z DOS-a? Wystarczy przeciągnąć plik *.rc nad ikonę programu i gotowe!

Juz wiem o co chodzi:
zamiast w files.rc
PAD RCDATA "Pad.exe"
trzeba uzyc
PAD RCDATA "Pad.exe"

Wynika to z tego, zeby php tych cudzyslowow zle nie potraktowalo, to Boduch tak napisal ;)

U mnie wyskakuje identyczny komunikat. Ja mam Windows 2000. Moze cos z kodem jest nie tak...

A u mnie wyskakuje takie coś w dosie:
[size=18]Fatal error Bad character in source input[/size]
i nie wiem co zrobić. Może to dlatego, że mam Windowsa XP.

Jest jeszcze jedna sprawa dotycząca instalatorów - każda porządna aplikacja zapisuje swoje informacje w rejestrze - powinieneś tu gdzieś o tym wspomnieć, a poza tym bardzo się przyda :P

Genialnie stary chociaz nie robie instalatora to ratujesz mi zycie :P

Panie Johny:
jeśli chcesz to "przekompilować" trzeba wpisać:
brcc32.exe files.txt
U mnie tak działa!

A nie już wiem o co chodzi :
tszeba małymi literami napisać :)

A mi wyskokuje błąd przy kompilacji:
Error file not found files.res

Mam zainstalowanego Delphi 7 a w katalogu bin nie mam takie pliku jak brcc32.exe Mógłby mi ktoś przesłać ten plik na email piter@lotnisko.net

pod implemenation

"Gdzieś w kodzie Twojego instalatora umieść taką linię:" Gdzieś dokładniej pod uses:P