Форум: "Основная";
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];
ВнизТеория и практика работы с ресурсами. Найти похожие ветки
← →
Андрей Сенченко (2002-02-11 10:27) [0]Теория мне известна:
1. Создать некий RC файл.
2. Обработать его программой brcc32.exe
3. Подключить готовый ресурс через {+R}
4. Наслаждаться использованием.
С практикой сложнее:
1. В свой ресурс нужно вставить:
(1.1.) несколько иконок ( надоело грузить просто с диска - хочу чтоб красиво было )
(1.2.) ДОС-овский RAR. Ну не хочу я хранить его отдельно на диске, а использую активно.
Вопрос* : а собственно каков формат того самого RC файла ? Хотя бы в моем конкретном случае. И где найти его описание на будущее ? Запуск brcc32.exe /? не совсем помог - слишком быстро гасится окно - читать не успеваю :)
2. и 3. Вопросов вроде как нет
4. Наслаждаться не совсем получаеися - тупым поиском по F1 не удалось найти тот самый набор функций, который отвечает за обработку ресурсов ( может неправильно слово по-английски пишу ).
Вопрос* : Подскажите пожалуйста хотябы процедуру типа LoadFromМойРесурс - дальше сам по ссылкам накопаю.
Спасибо
← →
Виктор Щербаков (2002-02-11 10:47) [1]1. В меню IDE пункт:
Project/Resources
решит многие проблемы, ИМХО, намного проще, чем brcc32.exe.
4. В SDK Resource Functions внимательно смотрел?
← →
Андрей Сенченко (2002-02-11 10:53) [2]4. >> ( может неправильно слово по-английски пишу ).
Вопрос снят.
По 1-му пока нет
← →
Digitman (2002-02-11 10:54) [3]>>"..слишком быстро гасится окно - читать не успеваю"
На то есть CommandPrompt-меню : вызови его и запусти brcc32.exe командной строкой
В составе Wi32API есть вызовы FindResource() и LoadResource(), отвечающие за поиск и загрузку в память заданных ресурсов заданного типа в/из заданного модуля. Универсальней, чем эти вызовы, не найдешь.
← →
Андрей Сенченко (2002-02-11 11:03) [4]>> Digitman © (11.02.02 10:54)
>> На то есть CommandPrompt-меню : вызови его и запусти
>> brcc32.exe командной строкой
Что практически и было. Из под Windows Commander 5.0. Видимо, где-то валяется ярлык с галкой "Закрывать по завершении"
И все-таки ... Раскроет кто-нибудь тайну структуры RC-файла ?
← →
Digitman (2002-02-11 11:17) [5]>>"Из под Windows Commander 5.0"
Никакого ярлыка нет. brcc32.exe - консоль. Вызови меню "Program|Accessories|CommandPrompt" и в открывшемся окне, эмулирующем DOS-консоль, запусти brcc32 ком.строкой - консольный вывод brcc32 будет направлен в тек.активное окно эмулятора DOS-консоли и исчезнет вместе с его закрытием по команде EXIT.
Не понял) *.RC - обычный текстовый формат, описывающий ресурсы на спец.языке. Ты же сам его и создавал для передачи на обработку в brcc32, а теперь формат его выясняешь ?
← →
Андрей Сенченко (2002-02-11 11:27) [6]Digitman © (11.02.02 11:17)
>> Не понял) *.RC - обычный текстовый формат, описывающий
>> ресурсы на спец.языке. Ты же сам его и создавал для
>> передачи на обработку в brcc32, а теперь формат его выясняешь ?
Ну не создавал я его. Не создавал. Смотри собствеено мой первый вопрос. Я ЗНАЮ, что его НУЖНО создать, но я НЕ ЗНАЮ как его написать
← →
Digitman (2002-02-11 11:31) [7]Вот, к примеру, строчка, которую нужно поместить в *.RC-файл для подключения к ресурсам некоего файла :
MYFILE RCDATA "SOMEFILE.EXT"
← →
Андрей Сенченко (2002-02-11 11:35) [8]Угумс. Осталось выяснить возможные варианты того самого RCDATA
Это ведь может быть и программа и, и иконка, и все что угодно. Ну Сергей, ну что так сложно ссылку дать на раздел хелпа или книжку ? Я ведь не прошу писать этот файл за меня - у самого руки имеются.
← →
McSimm (2002-02-11 12:44) [9]Есть способ приятнее 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
← →
Digitman (2002-02-11 12:53) [10]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.
← →
Андрей Сенченко (2002-02-11 12:58) [11]YES !!!
Вот теперь ОГРОМНОЕ СПАСИБО !!!
← →
NailS (2002-02-11 15:10) [12]Возник вопрос собственно по теме.
Как динамически (в RunTime) загрузить ресурсы в приложение и потом их использовать?
← →
Юрий Зотов (2002-02-11 16:17) [13]NailS © (11.02.02 15:10)
Cм. TResourceStream.
← →
Pete (2002-02-11 16:50) [14]Зачем досовский РАР??? есть в раре PAS с прототипами
← →
NailS (2002-02-11 17:18) [15]Что-то не получается найти ресурс по идентификатору (и имени тоже).
Поправте, где я не правильно делаю.
Собрал 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, т.е. ресурс не найден ;(
← →
Андрей Сенченко (2002-02-11 17:28) [16]>> Pete © (11.02.02 16:50)
>> Зачем досовский РАР??? есть в раре PAS с прототипами
Надо значит надо :) Есть определенные требования начальства, от которых лучше не отходить - пусть он хоть Лексикон захочет в свое приложение встроить
← →
Digitman (2002-02-11 17:51) [17]>NailS
1. TResourceStream предназначен, в 1-ю очередь, для работы с ресурсами типа RT_RCDATA, хранящих потоковый образ сохраненных объектов класса TComponent.
2.>>"В результате функция FindResource возвращает значение 0, т.е. ресурс не найден"
В каком результате ? Где в твоем коде хоть какое-то упоминание о вызове FindResource() ? Как ты вызываешь эту ф-цию ? Зачем она вообще тебе потребоваоась, если всю рутинную работу по поиску и загрузке ресурса ты уже переложил на тело конструктора объекта TResourceStream ? Тем более, что, насколько понятно из твоего объяснения, вызов конструктора не вызвал исключение, а, значит, указанный ресурс был локализован и загружен в память успешно !
← →
NailS (2002-02-11 18:04) [18]> Digitman
Сорри, в предыдущем сообщении написал сумбурно.
FindResource вызывается в функции Initialize класса TResourceStream,
HResInfo := FindResource(Instance, Name, ResType);
if HResInfo = 0 then Error;
а Initialize , в свою очередь, вызывается уже в конструкторе класса TResourceStream.
И вот, собственно говоря, FindResource 0 и возвращает.
А как мне иконки достать?
← →
Digitman (2002-02-11 18:34) [19]А ты вообще в курсе, что, когда какой-либо WinAPI-вызов дает отказ, можно (и следует !) получить детальную инф-цию об отказе, как сие предписывает MS ?
"возвращает значение 0, т.е. ресурс не найден " - на основании чего ты сделал такой вывод ? Ты получил сообщение об исключении именно с таким "приговором" или это только предположение твое ?
← →
NailS (2002-02-11 19:30) [20]Исходя из исходников TResourceStream
if HResInfo = 0 then Error;
procedure Error;
begin
raise EResNotFound.CreateFmt(SResNotFound, [Name]);
end;
SResNotFound = "Resource %s not found";
А SysErrorMessage(GetLastInfo) возвращает "Указанный тип ресурса в файле образа отсутствует"
Подставлял другие значения ResType, рузультат тот же.
Причем MicroAngelo эти иконки в длл отоброжает правильно.
Может я длл неправильно собрал или имя ресурса ввожу неверно?
← →
Иван Шихалев (2002-02-11 21:00) [21]Во-первых, не
"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
соответственно.
← →
Esa (2002-02-19 11:34) [22]Удалено модератором
← →
Anatoly Podgoretsky (2002-02-19 23:19) [23]Андрей Сенченко © (11.02.02 11:35)
Это пред-определенный тип, наряду с другими, приведенными в ответах, но МС не ограничивает тебя в использование типов, сожешь создавать свои пользовательские с любым именем, например
FARRES FAR PATH\FAR.EXE
То есть в упрощенном синтаксисе
ИМЯ ТИП ПУТЬ
← →
Esa (2002-02-20 09:40) [24]Извините, но я что-то не понял, почему мой вопрос был удален модератором?
Я не по теме спросил или что-то другое?
← →
Иван Шихалев (2002-02-20 16:48) [25]Просто вопросы нужно в отдельной ветке задавать.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.006 c