Odłączenie i zachowanie zasobów w exe lub dll - praca z systemem - artykuły Delphi -

Odłączenie i ochronę zasobów w DLL lub EXE

Czasami trzeba uszyć zasobów do pliku wykonywalnego aplikacji (np aby zapobiec przypadkowemu usunięciu przez użytkownika, lub aby chronić je przed zmianami). Ten przykład pokazuje, jak uszyć dowolny plik jako zasób w EXE Schnick.







Następnie zastanowić się, jak utworzyć plik zasobów zawierający koriyu dowolny plik. Po utworzeniu tego pliku, można łatwo dołączyć do projektu dyrektywy. Plik zasobów, które będziemy tworzyć w następującym formacie:

  • chodnikowiec

  • nagłówek dla naszego RCDATA zasobów
  • rzeczywiste dane - zasób RCDATA

Ten przykład pokazuje, jak zapisać plik zasobów, tylko jeden plik, ale myślę, że równie dobrze można zapisać kilka plików.

Tytuł zasobu przedstawia się następująco:
TResHeader = rekord
Datasize: DWORD; // rozmiar danych
HeaderSize: DWORD; // rozmiar rekordu
ResType: DWORD; // niska słowo = $ FFFF => porządkowa
Pozost: DWORD; // niska słowo = $ FFFF => porządkowa
DataVersion: DWORD; // *
MemoryFlags: WORD;
ID_języka: WORD; // *
Wersja: DWORD; // *
Charakterystyka: DWORD; // *
kończyć;

Pola oznaczone gwiazdką nie będziemy używać.

Powyższy kod tworzy plik zasobów i kopiuje go do pliku:
Procedura CreateResourceFile (
DataFile, ResFile: string; // nazwy plików
Pozost: Integer // id Resources
);
var
FS, RS: TFileStream;
FileHeader, ResHeader: TResHeader;






Wyściółka: tablica [0..SizeOf (słowa) -1] bajt;
rozpocząć


FS: = TFileStream.Create (// odczyt danych z pliku
DataFile, fmOpenRead);
RS: = TFileStream.Create (// napisać plik zasobów
ResFile, fmCreate);

<Создаём заголовок файла ресурсов - все нули, за исключением
HeaderSize, ResType i pozost>
FillChar (FileHeader, sizeof (FileHeader), # 0);
FileHeader.HeaderSize: = sizeof (FileHeader);
FileHeader.ResId: = $ 0000FFFF;
FileHeader.ResType: = $ 0000FFFF;

<Создаём заголовок данных для RC_DATA файла
Uwaga: aby utworzyć więcej niż jednego zasobu, należy
powtórz następujący proces, za każdym razem używając innego
Identyfikator zasobu>
FillChar (ResHeader, sizeof (ResHeader), # 0);
ResHeader.HeaderSize: = sizeof (ResHeader);
// id zasobu - FFFF oznacza „nie ciąg!”
ResHeader.ResId: = $ 0000FFFF lub (pozost SHL 16);
// typ zasobu - RT_RCDATA (z jednostki w systemie Windows)
ResHeader.ResType: = $ 0000FFFF
lub (słowo (RT_RCDATA) shl 16);
// rozmiar danych - nie wielkości pliku
ResHeader.DataSize: = FS.Size;
// Ustawienie flagi pamięci niezbędnej
ResHeader.MemoryFlags: = $ 0030;

<Записываем заголовки в файл ресурсов>
RS.WriteBuffer (FileHeader, sizeof (FileHeader));
RS.WriteBuffer (ResHeader, sizeof (ResHeader));

śmieci zrobi!>
jeśli FS.Size mod sizeof (DWORD) <> 0 wtedy
RS.WriteBuffer (obicia, sizeof (DWORD) -
FS.Size mod sizeof (DWORD));

Ten kod nie jest bardzo piękny, i nie ma obsługi błędów. Jest mądry, aby utworzyć klasę, która zawiera ten przykład.

Wydobywania zasobów z EXE

Teraz rozważmy przykład pokazujący, jak wydobycie zasobów z modułu wykonywalnego.

Wszystko co jest potrzebne jest uzyskanie Instance exe lub dll Schnick (w aplikacji jest Application.Instance lub Application.Handle dla dll trzeba dostać to sam :)
pozost
ten sam identyfikator. który został przydzielony zasób
ResType: WAVEFILE, bitmapy, kursor, CUSTOM
Ten typ zasobu, który może pracować, ale był w stanie skutecznie przeprowadzić procedurę tylko CUSTOM
FileName
to nazwa pliku, który chcesz utworzyć z zasobem







Podobne artykuły