Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение ресурсов файла (ЕХЕ, DLL и т.д.), Пример кода 
:(
    Опции темы
Baa
Дата 22.6.2002, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 8
Всего: 12



Вот заметил, что многих этот вопрос интересует, но ответа на него четкого так дано и не было, потому решил написать небольшой пример ( сразу прошу прощения за кривой код :\ )
Значит так:
Есть 2 DLL, в каждой есть по рисунку.
Задача: Надо сменить рисунок из DLL1 на рисунок из DLL2.
(Битмап в них:
#define BITMAP_2 2
BITMAP_2 BITMAP "test/ter1bu.bmp"
т.е. мне заранее известен ID битмапа, чем я и воспользовался)
А терь реализация:
Код

int ChangeBitmap()
{
HINSTANCE hHandle = LoadLibrary ("D:\\Projects\\Tutorials\\Res\\ResUpdate.dll");
   if (hHandle)
{
HRSRC hResLoad = FindResource (hHandle, MAKEINTRESOURCE (2), RT_BITMAP);
if (hResLoad == NULL)
{
AfxMessageBox("Не могу найти картинку.");
return 0;
}

HGLOBAL hResData = LoadResource (hHandle, hResLoad);
if (hResData == NULL)
{
AfxMessageBox("Не могу загрузить картинку.");
           return 0;
}

LPVOID data = LockResource(hResData);
if (data == NULL)
{  
AfxMessageBox("Не могу зафиксировать картинку в памяти.");
return 0;
}

HANDLE hUHandle = BeginUpdateResource ("D:\\Projects\\Tutorials\\Res\\Res.dll", false);
if (hUHandle == NULL)
{
AfxMessageBox ("Не могу открыть файл для записи.");
return 0;
}

BOOL result = UpdateResource (hUHandle, RT_BITMAP, MAKEINTRESOURCE (2), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), data, SizeofResource (hHandle, hResLoad));
if (result == false)
{
AfxMessageBox ("Не могу добавить ресурс.");
return 0;
}

if (!EndUpdateResource(hUHandle, false)) AfxMessageBox ("Не могу записать изменения в файл.");

if (!FreeLibrary (hHandle)) AfxMessageBox ("Не могу освободить дескриптор.");
}

return 1;
}



--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Baa
Дата 22.6.2002, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 8
Всего: 12



Если кому надо, могу выслать проект и ДЛЛы.


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Sheff
Дата 25.6.2002, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: 3
Всего: 3



Да, но ведь BeginUpdateResource пашет только в WinNt/2000/XP, а как обновить ресурс под Win9x ?


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Baa
Дата 25.6.2002, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 8
Всего: 12



Ну насчет этого есть токо предположение...таким я не занимался %) дык вот :) надо найти начала ресурса и уже оттуда побайтно вписать свой ресурс...Будет время, покопаюсь :)


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
suborg
Дата 26.6.2002, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



А других вариантов, я так полагаю, и нету. Ну, по крайней мере документированных и не подразумевающих перелинковку файла вручную. Один нюанс - в виндах на базе NT можно таким образом менять ресурсы независимо от их размера, а при побайтовой замене в 95 придется придерживаться жестких рамок.
PM MAIL WWW ICQ   Вверх
Sheff
Дата 26.6.2002, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: 3
Всего: 3



Мне вот интересно, если я знаю ID ресурса, как мне(В Win9x) найти offset этого ресурса от начала файла, узнать его размер и т.д


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
suborg
Дата 26.6.2002, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



Na skolko ya ponimayu, funkciyami FindResource i LoadResource mozhno poluchit' sami resursy, a ih uzhe mozhno iskat' v dll i exe kak izvestnye dannye vnutri fayla. No luchshe vse taki pochitat' format Portable Executable.

PS: sorry za transliteraciyu - linux postavil, s russkim yazykom esho ne razobralsa
PM MAIL WWW ICQ   Вверх
Sheff
Дата 26.6.2002, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: 3
Всего: 3



Цитата(suborg @ 26.6.2002, 22:12)
Na skolko ya ponimayu, funkciyami FindResource i LoadResource mozhno poluchit' sami resursy, a ih uzhe mozhno iskat' v dll i exe kak izvestnye dannye vnutri fayla. No luchshe vse taki pochitat' format Portable Executable.

PS: sorry za transliteraciyu - linux postavil, s russkim yazykom esho ne razobralsa

А вот заменять сложнее, нужно передвинуться по файлу на позицию ресурса, и потом туда raw data писать, но как ты сказал, там строгие рамки. Я знаю программы, которые заменяют ресурсы под Win9x и при том можно заменить, допустим 1 .bmp на другой .bmp любого размера, как же они так делают ??


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Sheff
Дата 26.6.2002, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: 3
Всего: 3



Кстати, я тут вспомнил, что когда-то писал прогу, которая из файла все ресурсы выдирает(можно и выборочно), притом определяет, что за ресурс, bmp, wav и т.д. Кому надо могу дать исходник, только она не доделана до конца, нет UpdateResource :( и некоторые ресурсы типа cursor'ов выдираются,  сохраняются на диск, но не работают как должны, я просто не умею работать с этими CURSORFILEHEADER'ами или как их там...


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Baa
Дата 27.6.2002, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 8
Всего: 12



На самом деле реально вписывать ресурсы любого размера...надо токо поправить за собой заголовок ( срс, размер и т.д.)


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
suborg
Дата 27.6.2002, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



А CRC играет какую-то роль?
Ведь когда патчишь EXE, никаких проблем с CRC не возникает, несмотря на явное изменение.
PM MAIL WWW ICQ   Вверх
Baa
Дата 28.6.2002, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 8
Всего: 12



Смотря какие ехе


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Unregistered
Дата 31.7.2003, 08:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Это все ерунда а вот как использовать ресурс из DLL например AVI или еще чтонибуть, кто знает скиньте пример?! [email protected]
  Вверх
Unregistered
Дата 31.7.2003, 14:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











jeslji ispolzujetsa windows animation control, to naprimer Animate_OpenEx(hwnd, hinst, lpszName)

hwnd - handle na animation control
hinst - handle na tvoi dll
v lpszName mozjno zapsatj MAKEINTRESOURCE(avi_res_id) , gje avi_res_id - id tvojevo AVI resursa

see MSDN;)
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0653 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.