![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Теория и практика работы с ресурсами.
Андрей Сенченко © (2002-02-11 10:27:00)Теория мне известна:
1.Создать некий RC файл.
2.Обработать его программой brcc32.exe
3.Подключить готовый ресурс через {+R}
4.Наслаждаться использованием.
С практикой сложнее:
1.В свой ресурс нужно вставить:
(1.1.) несколько иконок ( надоело грузить просто с диска - хочу чтоб красиво было )
(1.2.) ДОС-овский RAR. Ну не хочу я хранить его отдельно на диске, а использую активно.
Вопрос* :а собственно каков формат того самого RC файла ? Хотя бы в моем конкретном случае. И где найти его описание на будущее ? Запуск brcc32.exe /? не совсем помог - слишком быстро гасится окно - читать не успеваю :)
2.и 3.Вопросов вроде как нет
4.Наслаждаться не совсем получаеися - тупым поиском по F1 не удалось найти тот самый набор функций, который отвечает за обработку ресурсов ( может неправильно слово по-английски пишу ).
Вопрос* :Подскажите пожалуйста хотябы процедуру типа LoadFromМойРесурс - дальше сам по ссылкам накопаю.
Спасибо
Иван Шихалев (2002-02-20 16:48:00) [1]Просто вопросы нужно в отдельной ветке задавать.
Esa (2002-02-20 09:40:00) [2]Извините, но я что-то не понял, почему мой вопрос был удален модератором?
Я не по теме спросил или что-то другое?
Anatoly Podgoretsky (2002-02-19 23:19:00) [3]Андрей Сенченко © (11.02.02 11:35)
Это пред-определенный тип, наряду с другими, приведенными в ответах, но МС не ограничивает тебя в использование типов, сожешь создавать свои пользовательские с любым именем, например
FARRES FAR PATH\FAR.EXE
То есть в упрощенном синтаксисе
ИМЯ ТИП ПУТЬ
Esa (2002-02-19 11:34:00) [4]Удалено модератором
Иван Шихалев (2002-02-11 21:00:00) [5]Во-первых, не
"RT_ICON", аRT_ICON, а во-вторых, неRT_ICON, аRT_ICON_GROUP, а потом его разбираешь и загружаешь ужеRT_ICON. Дело в том, что иконки и курсоры хранятся не единым куском, а достаточно хитрой структурой. В качестве примера работы с ней я уже давно выложил в кладовку "Icon Extractor" http://delphi.mastak.ru/cgi-bin/download.pl?look=1&id=1004556220&n=2. Он извлекает только иконки, работа с курсорами выглядит полностью аналогично, только вместоRT_ICONиRT_ICON_GROUP,RT_CURSORиRT_CURSOR_GROUPсоответственно.
NailS (2002-02-11 19:30:00) [6]Исходя из исходников TResourceStream
if HResInfo = 0 then Error;
procedure Error;
begin
raise EResNotFound.CreateFmt(SResNotFound, [Name]);
end;
SResNotFound = "Resource %s not found";
А SysErrorMessage(GetLastInfo) возвращает "Указанный тип ресурса в файле образа отсутствует"
Подставлял другие значения ResType, рузультат тот же.
Причем MicroAngelo эти иконки в длл отоброжает правильно.
Может я длл неправильно собрал или имя ресурса ввожу неверно?
Digitman (2002-02-11 18:34:00) [7]А ты вообще в курсе, что, когда какой-либо WinAPI-вызов дает отказ, можно (и следует !) получить детальную инф-цию об отказе, как сие предписывает MS ?
"возвращает значение 0, т.е. ресурс не найден " - на основании чего ты сделал такой вывод ? Ты получил сообщение об исключении именно с таким "приговором" или это только предположение твое ?
NailS (2002-02-11 18:04:00) [8]> Digitman
Сорри, в предыдущем сообщении написал сумбурно.
FindResource вызывается в функции Initialize класса TResourceStream,
HResInfo := FindResource(Instance, Name, ResType);
if HResInfo = 0 then Error;
а Initialize , в свою очередь, вызывается уже в конструкторе класса TResourceStream.
И вот, собственно говоря, FindResource 0 и возвращает.
А как мне иконки достать?
Digitman (2002-02-11 17:51:00) [9]>NailS
1. TResourceStream предназначен, в 1-ю очередь, для работы с ресурсами типа RT_RCDATA, хранящих потоковый образ сохраненных объектов класса TComponent.
2.>>"В результате функция FindResource возвращает значение 0, т.е. ресурс не найден"
В каком результате ? Где в твоем коде хоть какое-то упоминание о вызове FindResource() ? Как ты вызываешь эту ф-цию ? Зачем она вообще тебе потребоваоась, если всю рутинную работу по поиску и загрузке ресурса ты уже переложил на тело конструктора объекта TResourceStream ? Тем более, что, насколько понятно из твоего объяснения, вызов конструктора не вызвал исключение, а, значит, указанный ресурс был локализован и загружен в память успешно !
Андрей Сенченко (2002-02-11 17:28:00) [10]>> Pete © (11.02.02 16:50)
>> Зачем досовский РАР??? есть в раре PAS с прототипами
Надо значит надо :) Есть определенные требования начальства, от которых лучше не отходить - пусть он хоть Лексикон захочет в свое приложение встроить
NailS (2002-02-11 17:18:00) [11]Что-то не получается найти ресурс по идентификатору (и имени тоже).
Поправте, где я не правильно делаю.
Собрал Res файл, который содержит 2 иконки.
(RC-файл выглядит как
123 ICON "0.ico"
222 ICON "1.ico")
Далее включил этот файл в длл, как
library Test;
{$R Oper.RES}
begin
end.
В приложении пытаюсь достать иконки таким способом
ResourceHandle := LoadLibrary("test.dll");
aResStream := TResourceStream.Create(ResourceHandle,"#123","RT_ICON");
В результате функция FindResource возвращает значение 0, т.е. ресурс не найден ;(
Pete (2002-02-11 16:50:00) [12]Зачем досовский РАР??? есть в раре PAS с прототипами
Юрий Зотов (2002-02-11 16:17:00) [13]NailS © (11.02.02 15:10)
Cм. TResourceStream.
NailS (2002-02-11 15:10:00) [14]Возник вопрос собственно по теме.
Как динамически (в RunTime) загрузить ресурсы в приложение и потом их использовать?
Андрей Сенченко (2002-02-11 12:58:00) [15]YES !!!
Вот теперь ОГРОМНОЕ СПАСИБО !!!
Digitman (2002-02-11 12:53:00) [16]RCDATA - нетипизированный ресурсный тип. В ресурсах такого типа может храниться все, что угодно, но интерпретация/обработка считанных ресурсов такого типа возлагается на приложение, поскольку ОС не имеет никаких предположений о содержимом таких ресурсов : она лишь грузит/выгружает из в/из памяти. Прочие ресурсные типы (CURSOR, ICON, MENU, ACCELERATOR и т.п.) являются стандартными ресурсами Windows, и их интерпретация/обработка может производиться встроенными средствами ОС
Вот здесь скачиваешь дистрибутив ResHacker.
http://rpi.net.au/~ajohnson/resourcehacker/
Открыв с помощью него, к примеру, EXCEL.EXE, сохраняешь его ресурсы в формате *.RC, открываешь полученный RC-файл с помощью любого текст.ред-ра и внимательно изучаешь его содержимое, сопоставляя с уже имеющимися у тебя представлениями и описанием вышеупомянутых Win32API-вызовов (FindResource и LoadResource) в Delphi Win32API SDK help и MSDN.
McSimm (2002-02-11 12:44:00) [17]Есть способ приятнее brcc32.exe. Достаточно добавить к проекту файл .rc (Project/Add to Project), или в файле проекта вставить:
{$R "myfile.res" "myfile.rc"}
После этого компилятор сам будет отслеживать изменения и компилировать файл ресурсов.
Описание формата я и не искал - пользовался найденными образцами. Но оно есть в MSDN: вот неполный перечень тех самых ключевых слов:
ACCELERATORS,BITMAP,CURSOR,DIALOG,DIALOGEX,FONT,ICON,MENU,MENUEX,MESSAGETABLE,POPUP,RCDATA,STRINGTABLE,VERSIONINFO
Андрей Сенченко (2002-02-11 11:35:00) [18]Угумс. Осталось выяснить возможные варианты того самого RCDATA
Это ведь может быть и программа и, и иконка, и все что угодно. Ну Сергей, ну что так сложно ссылку дать на раздел хелпа или книжку ? Я ведь не прошу писать этот файл за меня - у самого руки имеются.
Digitman (2002-02-11 11:31:00) [19]Вот, к примеру, строчка, которую нужно поместить в *.RC-файл для подключения к ресурсам некоего файла :
MYFILE RCDATA "SOMEFILE.EXT"
Андрей Сенченко (2002-02-11 11:27:00) [20]Digitman © (11.02.02 11:17)
>> Не понял) *.RC - обычный текстовый формат, описывающий
>> ресурсы на спец.языке. Ты же сам его и создавал для
>> передачи на обработку в brcc32, а теперь формат его выясняешь ?
Ну не создавал я его. Не создавал. Смотри собствеено мой первый вопрос. Я ЗНАЮ, что его НУЖНО создать, но я НЕ ЗНАЮ как его написать