Изключването и опазването на ресурсите в EXE или DLL - работа със системата - Delphi изделия -
Изключването и опазването на ресурсите в DLL или EXE
Понякога трябва да шият на ресурсите в изпълнимия файл на вашето приложение (например, за да се предотврати случайно изтриване от потребителя, или да ги предпази от промени). Този пример показва как да шият всеки файл, като ресурс в EXE-Schnick.
На следващо място, помислете как да се създаде ресурс файл, съдържащ koriyu всеки файл. След като създадете този файл, лесно можете да прикачите към директива вашия проект. ресурс файл, който ще се създаде в следния формат:- удар с глава
- позиция за нашия ресурс RCDATA
- действителните данни - RCDATA ресурс
Този пример ще ви покажем как да запишете файла на ресурсите, само един файл, но аз мисля, че също толкова лесно можете да запишете няколко файлове.
Заглавие на ресурса е както следва:
TResHeader = рекорд
DataSize: DWORD; // размер на данните
HeaderSize: DWORD; // размер на този запис
ResType: DWORD; // ниската думата = $ FFFF => редни
Resid: DWORD; // ниската думата = $ FFFF => редни
DataVersion: DWORD; // *
MemoryFlags: WORD;
LanguageId: WORD; // *
Версия: DWORD; // *
Характеристики: DWORD; // *
приключи;
Полетата, отбелязани със звездичка Ние няма да използваме.
В горния код създава файл на ресурсите и копира във файла:
процедура CreateResourceFile (
Файл от данни, ResFile: низ; // имената на файловете
Resid: Integer // идентификационен ресурси
);
Var
FS, RS: TFileStream;
FileHeader, ResHeader: TResHeader;
Padding: масив [0..SizeOf (DWORD) -1] на байт;
започвам
FS: = TFileStream.Create (// четене на данни от файл
Файл от данни, fmOpenRead);
RS: = TFileStream.Create (// запис във файла ресурс
ResFile, fmCreate);
<Создаём заголовок файла ресурсов - все нули, за исключением
HeaderSize, ResType и мазут>
FillChar (FileHeader, SizeOf (FileHeader), # 0);
FileHeader.HeaderSize: = SizeOf (FileHeader);
FileHeader.ResId: = $ 0000FFFF;
FileHeader.ResType: = $ 0000FFFF;
<Создаём заголовок данных для RC_DATA файла
Забележка: за да създадете повече от един ресурс, трябва да
Повтарям следния процес, всеки път, когато с помощта на различни
ID на ресурсите>
FillChar (ResHeader, SizeOf (ResHeader), # 0);
ResHeader.HeaderSize: = SizeOf (ResHeader);
// идентификационен на ресурса - FFFF означава "не низ!"
ResHeader.ResId: = $ 0000FFFF или (RESID SHL 16);
// вид ресурс - RT_RCDATA (от Windows единица)
ResHeader.ResType: = $ 0000FFFF
или (WORD (RT_RCDATA) SHL 16);
// размерът на данни - има размер на файла
ResHeader.DataSize: = FS.Size;
// Задаване на необходимата знамена паметта
ResHeader.MemoryFlags: = $ 0030;
<Записываем заголовки в файл ресурсов>
RS.WriteBuffer (FileHeader, sizeof (FileHeader));
RS.WriteBuffer (ResHeader, sizeof (ResHeader));
ако FS.Size мод SizeOf (DWORD) <> 0 след това
RS.WriteBuffer (Padding, SizeOf (DWORD) -
FS.Size мод SizeOf (DWORD));
Този код не е много красива, и няма обработка на грешки. Това е мъдро да се създаде клас, който включва този пример.
Извличането на ресурси от EXE
А сега да разгледаме един пример, показващ как да извлечете ресурси от изпълнимия модул.
Всичко, което е необходимо е да се получи съд Търсейки-Schnick или DLL (в молбата Ви е Application.Instance или Application.Handle, за DLL, което трябва да го получите себе си :)
Resid
същото ID. която е назначен ресурс
ResType: WAVEFILE, BITMAP, стрелки, CUSTOM
Този вид ресурс, който може да работи, но аз бях в състояние успешно да изпълнява процедурата само CUSTOM
FileName
е името на файла, който искате да създадете от ресурса