Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
CYB3R
#1

Извлечение ресурсов в файл - C (СИ)

13.02.2012, 00:17. Просмотров 956. Ответов 2
Метки нет (Все метки)

Решил я написать простенькую программу под венду, опыта не имею. Застопорился, обращаюсь за советом. Хочу написать программу на C, которая бы извлекала ресурсы из себя.
Собираю таким образом:
Код
$ i486-mingw32-windres res.rc -o res.o
$ i486-mingw32-gcc app.c res.o -o app.exe
res.rc:
C
1
2
3
#include "res.h"
IDR_IMG BITMAP "hearts.bmp"
IDR_TXT README "README"
res.h:
C
1
2
#define IDR_IMG 0x0001
#define IDR_TXT voina_i_mir
app.c:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <windows.h>
#include "res.h"
 
int WINAPI WinMain( HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPSTR lpszCmdLine,
            int nCmdShow)
{
    MessageBox(NULL, "Сейчас извлеку все нужные файлы...", "EpicFail", 0);
 
    //код для извлечения ресурсов
 
    MessageBox(NULL, "Нифига я не извлёк :(", "EpicFail", 0);
    return 0;
}
Суть программы: после запуска рядом с исполняемым файлом должны появится ещё и "voina_i_mir.txt" и "myimage.bmp".
Дело-то за малым. Осталось только написать код для извлечения ресурсов и записи их в файл. Мучал гугл весь день, ничего не помогло. Помогите нубу, пожалуйста!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2012, 00:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Извлечение ресурсов в файл (C (СИ)):

Сохранение результата в файл и извлечение - C (СИ)
Здравствуйте! Подскажите,пожалуйста,как сделать извлечение из файла? Вот сохранение (для списка) void SaveSl() { FILE* f =...

Компиляция файла ресурсов - C (СИ)
Как в CodeBlocks откомпилировать файл ресурсов?

Создать текстовый файл из 5 строк, прочитать созданный файл и получить новый файл - C (СИ)
Создать текстовый файл из 5 строк, прочитать созданный файл и получить новый файл. Переписать в новый файл все строки, заменив все...

Освобождение ресурсов при получении терминирующего сигнала - C (СИ)
Здравствуйте уважаемые. Я только изучаю Си, и столкнулся с такой проблемой. Допустим пишу я сокет - сервер, предполагается, что...

Извлечение из ресурсов - C#
Подскажите как мне извлечить картинку из ресурсов. Гуглил читал понял только то что надо пользоваться FileStream больше пока ничего. Если...

C# Извлечение из ресурсов - C#
Есть бинарный файл в ресурсах, его нужно извлечь,далее с ним работает программа потом файл удаляется.Как извлекать ресурсы из файлов? И...

2
Black Fregat
1395 / 1026 / 231
Регистрация: 31.05.2009
Сообщений: 4,276
13.02.2012, 00:33 #2
C++
1
2
3
4
    HRSRC R1 = FindResource(NULL, Name, Type);
    HGLOBAL R2 = LoadResource(NULL, R1);
    LPVOID M = LockResource(R2);
    DWORD L = SizeofResource(NULL, R1);
Записать в файл L байт по адресу M сможете?
0
CYB3R
13.02.2012, 22:42 #3
С записью постараюсь сам разобраться, да и тут на форуме много тем про это.
А вот переменная Type меня несколько смущает. Насколько я понимаю, мне всегда нужно ставить RT_RCDATA, а не RT_BITMAP. Верно?

Добавлено через 10 часов 43 минуты
Цитата Сообщение от Black Fregat Посмотреть сообщение
Записать в файл L байт по адресу M сможете?
Всё-таки не сумел. Размер файла до упаковки 952486. После извлечения при помощи Resource Hacker - такой же. Внутри в программе:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    HRSRC R1 = FindResource(NULL, MAKEINTRESOURCE((int)IDR_IMG), RT_BITMAP);
    HGLOBAL R2 = LoadResource(NULL, R1);
    LPVOID M = LockResource(R2);
    DWORD L = SizeofResource(NULL, R1);
 
    printf("Size: %d \n", L);
    printf("Real: %d \n\n\n", sizeof(M));
 
    HANDLE  fp = CreateFile("tmp.bmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
                CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
 
    DWORD size;
 
    if(fp != INVALID_HANDLE_VALUE) {
        WriteFile(fp, &M, L, &size, NULL);
        FlushFileBuffers(fp);
        CloseHandle(fp);
    }
    printf("Written: %d", size);
Выдаёт:
Код
Size: 952472
Real: 4


Written: 0
Пару раз удавалось получить Written: 8, появлялся файл в 4 байта с таким содержанием:
Код
00000000  28 00 00 00                                       |(...|
00000004
Добавлено через 15 минут
Глупый я. Указатель не нужен, без него всё работает.
Код
Size: 952472
Real: 4


Written: 952472
Только такой файл ничем не открывается и меньше оригинала.

Добавлено через 3 часа 52 минуты
Всё. Разобрался. Нужно было экспортировать ресурс, как RCDATA и извлекать также.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2012, 22:42
Привет! Вот еще темы с ответами:

Извлечение ресурсов - Delphi
Программа хранит в себе dll файл и при запуске распаковывает его в C:\speed.dll но в чём-то ошибка пишет что ресурс не найден... ...

Извлечение ресурсов на WinApi - Delphi WinAPI
Добрый день! Требуется помощь. Пытаюсь извлечь из ресурсов три файла. Компиляция проходит успешно. При запуске программы - файлы не...

Извлечение сжатых ресурсов из EXE - Софт
Есть exe-шник, часть ресурсов в котором закодирована zlib-ом. При помощи PEiD+KANAL получил адрес сжатой области. Как можно извлечь оттуда...

Извлечение ресурсов из .exe файла - Delphi
Я хочу создать программу которая извлекала бы ресурсы из exe файла. И записывала бы в переменную. Помогите пожалуйста.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru