Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Давно заметил, что всё-таки языки С/C++ это не самый лучший вариант программирования под Windows. Сейчас появилась масса более современных и удобных языков, например тот же Python - кроссплатформенный язык, очень легок в изучение. Я его изучил буквально за несколько дней по этому курсу - ссылка. Автор постарался, там видеоуроки на удивление легкие и понятные.
Как засунуть файл в ресурсы и достать его оттуда
A: (Adil)
Оригинальная ссылка: нету

(например *.wav или *.exe).
Самый простой способ включить какой-либо файл в ресурсы, это добавить в файл описания ресурсов (*.rc) строку
ResurceName ТИП_РЕСУРСА "Имя файла"
Здесь:
ResurceName - уникальное имя ресурса, им мы будем пользоваться, когда будем загружать ресурс. В принципе здесь может стоять и числовой индентификатор ресурса (можно и определенный через #define, но тогда необходимо, чтобы из того места кода, где мы будем грузить ресурс, это определение тоже было видно; в таком случае обычно эти определения выносятся в заголовочный файл ресурсов- для них (файлов) принято использовать расширение *.rh).
ТИП_РЕСУРСА - идентификатор типа ресурса. RCDATA - специальный тип для бинарных ресурсов (грубо говоря, массив байт лежит как есть). *.wav тоже можно объявить как RCDATA, но принято его "регистрировать" как WAVE.
"Имя файла" - полное имя подключаемого файла вместе с расширением (директории разделяются одиночным '\').

Файл ресурса можно использовать уже имеющийся в проекте, или создать новый, не забыв подключить его к проекту.

Теперь как достать файл из ресурса.
Достают конечно же не сам файл, а массив байт, который этот файл представляет. Т.е. получают указатель на начало этого массива.

Вот пример кода:
    //Получаем хэндл модуля (исполняемого файла, *.exe или *.dll), в
 
     // котором лежит ресурс. NULL означает модуль, ассоциированный
 
     //с текущим процессом, хотя в этом случае можно сразу вызывать
 
     //FindResource, передавая первым параметром NULL,
 
     // а под VCL можно использовать глобальную HInstance
 
     HMODULE hMod=GetModuleHandle(NULL);
 
     // если ресурс лежит в другом файле, то параметр для GetModuleHandle
 
     // можно получить с помощью LoadLibrary(...);
 
     if(!hMod) {
 
         //Обработка ошибки
 
     }
 
     //Получаем дескриптор информационного блока нашего ресурса
 
     HRSRC hRes=FindResource(hMod,"ResurceName",RT_RCDATA);
 
     //Если ResurceName не было определено как число, то ResurceName
 
     //берется в кавычках. Иначе надо (LPSTR)ResurceName
 
     //Если тип ресурса был задан как WAVE, то последний параметр должен
 
     // быть "WAVE" - в кавычках!
 
     if(!hRes){
 
         //Обработка ошибки
 
     }
 
     //Теперь загружаем ресурс в память, получая дескриптор загру-
 
     //женного блока памяти.
 
     HGLOBAL hGlob=LoadResource(hMod,hRes);
 
     //Опять же, для ресурса в "текущем" модуле, первым параметром можно
 
     //передавать NULL
 
     if(!hGlob) {
 
         //Обработка ошибки
 
     }
 
     //И, наконец, последнее - получаем указатель на начало массива
 
     BYTE *lpbArray=(BYTE*)LockResource(hGlob);
 
     if(!lpbArray) {
 
         //Обработка ошибки
 
     }
 
 

Мы представили ресурс как массив байт - и можем делать с ним то, что хотели. Записать на диск как файл: (способов куча, я использую те функции, к которым привык)
//где то наверху должны быть подключены
 
 #include <stdio.h>
 
 #include <fcntl.h>
 
 #include <io.h>
 
 
 
     //Получаем размер массива (размер файла)
 
     DWORD dwFileSize=SizeofResource(hMod,hRes);
 
     if(!dwFileSize) {
 
         //Обработка ошибки
 
     }
 
 
 
     int
 
     hFile=open("AnyFileName",O_BINARY|O_CREAT|O_WRONLY,S_IWRITE);
 
 
 
     if(k==-1) {
 
         //Обработка ошибки
 
     }
 
     if(write(hFile,lpbArray,dwFileSize)==-1) {
 
         close(hFile);
 
         //Обработка ошибки;
 
     }  
 
     close(hFile);
 
 

Проиграть ресурс, (если, конечно, это был *.wav файл; причем не важно, как мы его объявляли - WAVE или RC_DATA)
//где то наверху должен быть подключен
 
 #include <mmsystem.h>
 
 
 
     DWORD fdwSound=SND_NOSTOP | SND_ASYNC | SND_NODEFAULT | SND_MEMORY;
 
     PlaySound(lpbArray, hMod, fdwSound);
 
     // в контексте данного топика важным является флаг SND_MEMORY:
 
     // образ звука храниться в памяти
 
 

Под "// Обработка ошибки" подразумевалось некоторое сообщение, если хочется, и, главное, НЕ выполнение последующего кода, иначе, в лучшем случае, при последующих вызовах функций API будут возвращаться ошибки (NULL), а могут случиться и более плачевные последствия

В приведенном коде использовались только функции API Windows и из стандартной сишной библиотеки, поэтому все должно работать и под VC, и под Builder'ом.

Вот, собственно, и все.


<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS