Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.005 c
7-19367
Drv
2001-12-02 20:05
2002.03.07
Реестр


3-19066
Bormanoid
2002-02-08 12:29
2002.03.07
Использование Combobox c DB -2


6-19290
kex
2001-12-19 12:05
2002.03.07
Как узнать программно свой IP?


1-19188
Egor111
2002-02-18 17:04
2002.03.07
Преобразование типов данных


3-19064
KAA
2002-02-07 14:40
2002.03.07
200 откат транзакций





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский