Programowanie w języku Delphi » Artykuły

Instalatory

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

TomRiddle 2011-04-02 12:03

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.

TomRiddle 2011-04-02 12:01

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

Wowol 2011-03-11 16:44

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

Darkhog 2010-10-07 00:28

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

robotboy111 2009-09-12 19:18

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

tomalla 2006-08-09 17:22

znaczy przestało ...

tomalla 2006-08-09 17:21

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

max1996 2006-07-24 20:33

u mnie nie czyta pliku files pomórzcie

tomalla 2006-05-10 17:17

A jak do *.rc dodawać foldery?

tomalla 2006-05-10 17:14

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

leon92 2006-02-09 11:15

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.

leon92 2006-02-09 11:13

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.

vir2000 2006-01-13 16:24

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

Infor_mat_ik 2006-01-09 19:54

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

dzikimisiu 2006-01-01 12:21

mi wszystko działa super

b0b0- 2005-07-17 18:35

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 ??

blackrage 2004-06-01 01:39

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.

T-kOrreD 2004-05-23 18:20

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

Snowak 2004-05-15 18:07

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 ;)

Snowak 2004-04-12 10:47

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

Adam.Pilorz 2003-09-14 20:52

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

Dr Prozac 2003-05-01 18:38

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

Fire 2003-04-04 13:42

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

Johny 2003-03-19 09:49

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

Johny 2003-03-19 09:43

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

lofix 2003-01-09 14:50

pod implemenation

Drajwer 2002-12-20 17:23

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