Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание ресурсов.

548
16 августа 2007 года
Maximillian_Cavalera
157 / / 16.08.2007
Каким образом можно создавать файл ресурсов в который можно поместить любые файлы. Мне нужно скрыть от пользователя музыку, картинки и флэш-ролики.
16K
16 августа 2007 года
Zbyszek
118 / / 08.08.2007
Вот пример из Win32 Programmer's Reference:
Для добавления TEST.TLB в ресурсы программы достаточно в .RC файле дописать строчку
 
Код:
1 typelib TEST.TLB
548
24 августа 2007 года
Maximillian_Cavalera
157 / / 16.08.2007
Расскажите пожалуйста подробней об этом. Меня интересует, как созадавать ресурс, как помещать в него файлы, как ими пользоваться из ресурса. Уделите пожалуйста особое внимание этим темам.
16K
24 августа 2007 года
Zbyszek
118 / / 08.08.2007
Сначала нужно создать .rc-файл, который потом нужно обработать компилятором ресурсов и подключить к .exe-файлу строкой в исходном коде {$R myres.res}(это для Delphi, к сожалению не помню как для Builder'а).
.rc-файл - это текстовый файл, в котором каждая строка описывает ресурс. Для того чтобы добавить что-то, пишем с новой строки, например, так:
 
Код:
MYFILE Custom "FILE.dll"
При этом в группу ресурсов "Custom" добавится файл "FILE.dll" под именем "MYFILE".
Чтобы загрузить данные в программе нужно использовать ф-ию
 
Код:
HRSRC FindResource(HMODULE hModule, LPCTSTR lpName, LPCTSTR lpType);
где hModule - хэндл модуля, откуда нужно загружать ресурс, lpName - имя ресурса, lpType - тип ресурса (в нашем случае это RT_RCDATA). Потом
 
Код:
HGLOBAL LoadResource(HMODULE hModule, HRSRC hResInfo);
где hModule - хэндл модуля, откуда нужно загружать ресурс, hResInfo - значение, которое вернула FindResource. И потом
 
Код:
LPVOID LockResource(HGLOBAL hResData);
где hResData - значение, которое вернула LoadResource. LockResource возвращает указатель на данные в памяти, которые были загружены. Размер этих данных можно получить, вызвав
 
Код:
DWORD SizeofResource(HMODULE hModule, HRSRC hResInfo);
где hModule - хэндл модуля, откуда нужно загружать ресурс, hResInfo - значение, которое вернула FindResource.
Вроде бы так:)
548
24 августа 2007 года
Maximillian_Cavalera
157 / / 16.08.2007
Если я правильно понял, нужно описать в текстовом файле инфу о файлах и сохранить *.rc.
Как узнать Handle ресурса и как спрятать файлы?
Если Вам не трудно, могли бы Вы выложить исходник с описанием какого-нидь файла ресурса и пример его использования. Буду весьма Вам признателен за такую помощь.
16K
24 августа 2007 года
Zbyszek
118 / / 08.08.2007
Посмотри здесь (есть примеры работы с ресурсами через WinAPI), здесь (есть примеры работы с ресурсами с MFC), здесь и здесь (тоже работа с ресурсами, но на Delphi), и здесь, надеюсь, поможет. Врядли я смогу описать это лучше, чем уже написано, но если что-то непонятно, обращайся!:)
548
25 августа 2007 года
Maximillian_Cavalera
157 / / 16.08.2007
Спасибо за ответ. Могли бы Вы объяснить, там было описано что нужно скомпилировать файл ресурсов через программу входящую в состав Дельфи. Как пользоваться этой программой. Я её запустил, на секунду появилась консоль и закрылась. Больше ничего.
16K
25 августа 2007 года
Zbyszek
118 / / 08.08.2007
Запускается она довольно просто:
Пуск->Выполнить->cmd->cd /d путь куда установлена Delphi\Bin->brcc32. А вот что она хочет получить от нас:
Цитата:
Syntax: brcc32 [options ...] filename
options marked with a '*' are on by default

@<filename> Take instructions from command file
-r (ignored for compatibility)
-16 Build 16-bit Windows compatible .res file
-32 * Build 32-bit Windows compatible .res file
-fofilename Set output filename
-v Verbose
-ipath Set include path
-dname[=string] Define #define
-x Ignore INCLUDE environment variable
-m Enable multi-byte character support
-cdddd set default code page to nnnn
-lxxxx set default language to xxxx
-31 Provided for downward compatibility (build 16-bit .res file)
-w32 Provided for downward compatibility (build 16-bit .res file)
-? or -h Display this message

548
27 августа 2007 года
Maximillian_Cavalera
157 / / 16.08.2007
Эти данные которые Вы указали в цитате нужно так вводить как и там написано?
246
28 августа 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: Maximillian_Cavalera
Спасибо за ответ. Могли бы Вы объяснить, там было описано что нужно скомпилировать файл ресурсов через программу входящую в состав Дельфи. Как пользоваться этой программой. Я её запустил, на секунду появилась консоль и закрылась. Больше ничего.



Project|Add to Project = и выбрать файл ресурса => Ок.
Дальше все сделает IDE

548
30 августа 2007 года
Maximillian_Cavalera
157 / / 16.08.2007
Спасибо Вы мне очень помогли. У меня есть ещё один вопрос. Вот я написал программку которая при нажатии на кнопку должна загружать wav-файл из ресурса, вот код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
HRSRC FindHandle, ResHandle; //Если объявить как THandle, то выд-
LPVOID pc; // ошибку при компиляции
FindHandle = FindResource(HInstance, PChar("menuMusic"), PChar("WAVE")); // в этой строчке
ResHandle = LoadResource(HInstance,FindHandle);
pc = LockResource(ResHandle);
Button1->Caption = "Ok";
PlaySound(PChar(pc), 0, 0);
}

При нажатии на кнопку PlaySound издаёт стандартный звук,а не мою музыку из ресурса.
1
31 августа 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Maximillian_Cavalera
Спасибо Вы мне очень помогли. У меня есть ещё один вопрос. Вот я написал программку которая при нажатии на кнопку должна загружать wav-файл из ресурса, вот код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
HRSRC FindHandle, ResHandle; //Если объявить как THandle, то выд-
LPVOID pc; // ошибку при компиляции
FindHandle = FindResource(HInstance, PChar("menuMusic"), PChar("WAVE")); // в этой строчке
ResHandle = LoadResource(HInstance,FindHandle);
pc = LockResource(ResHandle);
Button1->Caption = "Ok";
PlaySound(PChar(pc), 0, 0);
}

При нажатии на кнопку PlaySound издаёт стандартный звук,а не мою музыку из ресурса.



 
Код:
PlaySound(NULL, ResHandle, SND_RESOURCE);
548
31 августа 2007 года
Maximillian_Cavalera
157 / / 16.08.2007
А как этот звук можно вывести на MediaPlayer?
1
01 сентября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Maximillian_Cavalera
А как этот звук можно вывести на MediaPlayer?


Звук никак. А если необходимо ресурс проиграть медиаплеером - то один из вариантов - создать временный файл и передать его компоненту в свойстве FileName. Возможно так же, что имеется способ проиграть потоковый файл - но я честно говоря не помню - посмотрите в справке. Вариант с временным файлом отработает точно - только важно не забывать убирать после себя мусор.

1.8K
30 апреля 2010 года
Arkady
153 / / 18.12.2007
Столкнулся с очень странной проблемой.
Есть DLL, в которой мне надо создать ресурс, а потом другой программкой этот ресурс доставать.

В исходном проекте с DLL есть файл .rc вот такого вида:
 
Код:
0x29A RCDATA DISCARDABLE "array.sig"

Сам файл sig - это 136ти байтная криптоподпись майкрософта.

Собирается DLL без проблем.

Но вот при попытке достать оттуда этот ресурс вот так:
 
Код:
hSigResource = FindResource(
                        hThisDll,
                        MAKEINTRESOURCE(0x29A),
                        RT_RCDATA);


Валится ошибка 1814, которая означает, что ресурс не найден.
Почему, что я делаю не так? :(

hThisDll - это действительно хендлер этой ДЛЛ. Может где-то надо что-то прописать?
RC файл компилируется в .res - нормально (т.е. res файл содержит нужные мне данные, это видно в редакторе, предоставляемом вижуал студией), этот res, как и rc - входят в состав проекта.
Когда импортирую makefile - там прописано, что .res - ресурс.

Но в DLL его нет. Почему?
С именами (вместо 0x29A) пробовал разное, вплоть до FFFF или 666. Одинаково не находит ресурс. Не знаю, что делать.
14
30 апреля 2010 года
Phodopus
3.3K / / 19.06.2008
Цитата: Arkady

Но в DLL его нет. Почему?
С именами (вместо 0x29A) пробовал разное, вплоть до FFFF или 666


1. Все-таки посмотрите, есть ли он непосредственно в dll программой типа reshacker.
2. Посмотрите его LangID
3. Попробуйте не численный идентификатор а строковый.
4. Чему численно равен hThisDll?

1.8K
30 апреля 2010 года
Arkady
153 / / 18.12.2007
Цитата: Phodopus
1. Все-таки посмотрите, есть ли он непосредственно в dll программой типа reshacker.
2. Посмотрите его LangID
3. Попробуйте не численный идентификатор а строковый.
4. Чему численно равен hThisDll?



Спасибо огромное!!! Эта программа помогла мне разобраться!

А заработало всё после того, как я добавил USERES("имяфайла.res") в проект, с этим не собиралось, удалил из проекта, удалил rc и res из проекта и физически, заново написал rc с теми же параметрами, заново добавил его в проект и так собрал.

А до этого я и строковый идентификатор использовал, и hThisDll проверял на адекватность (брал по хендлеру имя файла WinAPI).

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог