Большой Воронежский Форум
» Программирование>ресурсы в С++
xxx-men 17:34 02.12.2007
неахота в коде писать что то типо
пока что заполняю этот массив из файла....

вопрос: как этот фаил приципить к ехе'шнику и читать данные от туда?
вопрос по другому: как пользоваца ресурсами в С++? [Ответ]
Part!zan 17:40 02.12.2007
xxx-men, точно так же, как и в паскале, асме и т.д. То есть - читать мсдн. [Ответ]
The_God 22:20 02.12.2007
палишся.. не с++ это почему нулевой елемент забыл проинитить

а вабще когда нужно такую инфу в код впихнуть можно написать тулзу уоторая такой когд сгенерит и вкомпилить его в проект, можно файл открыть и прочитать из него значение массива, можно руками как ты сделал самомоу написать этот код... вот 3 способа
[Ответ]
Part!zan 23:14 02.12.2007

Сообщение от The_God:
написать тулзу уоторая такой когд сгенерит и вкомпилить его в проект

Месье тонкий извращенец?.. Не, иногда такое бывает нужно, но, имхо, не в данном случае. [Ответ]
The_God 23:35 02.12.2007
случаи бывают разные и бывают случаи когда данные из файла должны быть вкомпилены в код [Ответ]
liness 00:37 03.12.2007

Сообщение от The_God:
случаи бывают разные и бывают случаи когда данные из файла должны быть вкомпилены в код

ужас..... [Ответ]
Part!zan 01:24 03.12.2007

Сообщение от The_God:
случаи бывают разные

Сообщение от Part!zan:
имхо, не в данном случае

........ [Ответ]
The_God 01:43 03.12.2007
про данный случай известно только кусочек задачи, ничего про энвайремент задачи не известно, согласно которому и выбирается решение из различных.

разве не может быть такого что целевая платформа файлы не поддерживает и соответственно грузить их неоткуда [Ответ]
Part!zan 02:22 03.12.2007

Сообщение от The_God:
целевая платформа файлы не поддерживает

Я че-то сильно сомневаюсь, что у топикстартера такая трабла... Раз он про ресурсы говорит, то это, скорее всего, винда. [Ответ]
xxx-men 10:31 03.12.2007

Сообщение от The_God:
можно файл открыть и прочитать из него значение массива

так пока и делаю...таскать с exe'шником левый фаил нельзя

Сообщение от The_God:
можно руками как ты сделал самомоу написать этот код

нИхАчУ

Сообщение от The_God:
написать тулзу уоторая такой когд сгенерит

такой код генерировать это ппц.....
это не случайный набор символов
это не какая то зависимость y=f(x)
это четко заданая последовательность значений

Сообщение от Part!zan:
точно так же, как и в паскале, асме и т.д. То есть - читать мсдн.

ну не встречался я с этим не разу,
кстати проект MFC не юзает..
в нете ниче вразумительного не нашол

мсдн нет
надо качать
чистить винт
потом ставить
потом искать
потом разбираца
потом можно непонять
потом писать на форум
потом с форума слать в мсдн будут.... [Ответ]
xxx-men 10:32 03.12.2007

Сообщение от Part!zan:
точно так же, как и в паскале, асме и т.д. То есть - читать мсдн.

ну кто то может знает что то конкретно типо короткой инструкции
1)добавляеш в проект файлеГ
2)ему дадут типо ЙЯФАЙЛЕГ_1
3) пишеш #include <что нибуть>
4) пишеш в коде: for(x=0;x<=500;x++) {a[x]=мЕгафункцияДляЧтенияРесурсикоф(ЙАФАЙЛЕГ_1,x);}; [Ответ]
The_God 10:54 03.12.2007

Сообщение от xxx-men:
нИхАчУ

вот сдесь и зарыта собака

иди работать в макдональдс, весело и вкусно! [Ответ]
xxx-men 17:07 03.12.2007

Сообщение от The_God:
вот сдесь и зарыта собака

ды даже не в том дело что "нихачу"

такая хрань в коде как:

Сообщение от xxx-men:
а[1]=5;
a[2]=83;
a[3]=...........
...........
.......
...........
a[752]=16;
a[753]=79;
.........
...........

это как минимумум некрасиво...вот и нтересуюсь

ну кто нибуть может конкретно сказать?? [Ответ]
Part!zan 19:44 03.12.2007
xxx-men, без мсдн ты все равно ниче путного не напишешь. Никто не будет сюда описания функций копипастить. Так что, через "нихачу". [Ответ]
xxx-men 20:19 03.12.2007
а на пальцах эт как выглядит? [Ответ]
The_God 11:52 04.12.2007
тыкай указательным пальцем в левую кнопку мыши когда её курсорчек находится над ярлычком MSDN там набирай слово секретное "resources", и проникайся мудростью предков. [Ответ]
xxx-men 22:47 15.12.2007
подниму темку, может кто нибуть что то путное скажет [Ответ]
p51x 02:44 16.12.2007
Вот, что у меня валялось...

Сообщение от :
Как засунуть файл в ресурсы и достать его оттуда (например *.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'ом.

[Ответ]
xxx-men 07:01 16.12.2007
p51x, вот спасиба, прям расписано подробнее чем хотел, тему можно закрывать [Ответ]
Вверх