Kultura
Помогающий
Offline
|
|
« : 16-04-2009 12:22 » |
|
В игре (WinAPI & Visual C++) используется несколько файлов *.bmp, *.txt и *.wav (не слишком много).
Есть желание эти файлы разместить (скрыть) в экзешнике. Подскажите, как это сделать?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #1 : 16-04-2009 13:05 » |
|
Ресурсы не могут помочь?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #2 : 16-04-2009 14:55 » |
|
Да, наверное, могут.
Хотя txt-шник меняется, а изменять свой ресурс при исполнении, вроде, нельзя.
Хорошо, пусть будет часть дела. Подскажите, как целиком разместить *.bmp и *.wav - файлы в ресурсах?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #3 : 16-04-2009 15:11 » |
|
А в какой студии? Для BMP - стандартные ресурсы уже предусмотрены, для музыки - просто как бинарный файл.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #4 : 16-04-2009 15:35 » |
|
2008, express edition. Объясните подробнее про BMP и музыку. В гугле не нашлось За BMP знаю прописывать их в виде [*** BITMAP PATH], потом загружать, но сами файлы должны лежать отдельно.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #5 : 16-04-2009 15:49 » |
|
А почему именно Экспресс? У него вроде нет редактора ресурсов. Или?
Ну вот как например ты добавляешь иконки, курсоры ... ?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #6 : 16-04-2009 16:12 » |
|
Экспресс, потому что экономия Про редактор уже успел и забыть . Остается простое редактирование в текстовом виде. Так и добавляю IDI_SMALL ICON "small.ico" IDB_BITMAP BITMAP "bitmap.bmp"
small.ico, bitmap.bmp должны быть в папке. А как записать картинку прямо в экзешник этого как раз и не умею, и в гугле не нашел
|
|
« Последнее редактирование: 16-04-2009 16:15 от Kultura »
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #7 : 16-04-2009 16:30 » |
|
Kultura, Есть один способ, как поместить в исполняемый файл любые данные и потом обращаться к ним. Для этого не нужно пользоваться стандартным компилятором ресурсов. Способ очень прост, берётся обычный шеснадцатеричный редактор к примеру WinHex с возможностью экспорта данных в код на С++. Открывается в нем нужный файл и экспортируется. На выходе получаем обычный массив, который компилируется любым компилятором на любой системе.
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #8 : 16-04-2009 17:24 » |
|
RuNTiME, отличный способ, спасибо! Для чего-нибудь маленького в самый раз. Но массив на 100 тыс. строк - это жесть, первый раз увидел *.cpp файл на несколько мегабайт А что дальше с этими массивами делать (для *.bmp и *.wav)? Для *.bmp - это ж не только массив точек, наверное, еще служебная инфа, как отделить? Для *.wav вовсе без понятия
|
|
« Последнее редактирование: 16-04-2009 17:40 от Kultura »
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #9 : 16-04-2009 17:52 » |
|
Kultura, ну как сказать жесть откомпилил один раз в obj и забыл Кстати компилятор ресурсов в Qt работает подобным образом Я думаю лучше будет все это оформить ввиде нескольких cpp файлов (на каждый ресурс отдельно) и одного заголовочного файла к примеру resource.h. В cpp файлах тебе надо написать примерно следующее: //my_resource.cpp #include "resource.h"
const char *get_my_resource() { static const char test[] = { 0,1,2 //сгенерированный массив }; return test; }
И заголовочный файл resource.h const char *get_my_resource();
Обрати внимание, что массив с ресурсом объявлен как static, это очень важно, если этого не сделать, то ресурс будет помещаться в стек при каждом вызове функции О_о Ну, а дальше, подключай resource.h везде, где тебе нужен доступ к ресурсам и вызывай нужную функцию, для получения указателя на ресурс.
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 16-04-2009 17:53 » |
|
Kultura, добавь ресурс в дерево - Custom , обзови его, скажем "MYBIN" , дай идентификатор. Затем щёлкни дважды этот ресурс в дереве объектов - он откроется (пока ещё чистый) Затем. Открываешь в студии же нужный файл через File->Open (выбираешь OpenAS= binary ). Выделяй всё (ctrl+a) , копируй в буфер, вставляй в твой чистый ресурс. Открытый файл источник закрой от греха подальше, а ресурс - сохрани. как добраться до данных в программе: HRSRC hrsrc=0; HGLOBAL hgl=0; bool bDone=false; for(;;) { //ищем ресурс hrsrc=::FindResource(0,MAKEINTRESOURCE(ID_...),"MYBIN"); if(!hrsrc)break; //загружаем в озу hgl=::LoadResource(0,hrsrc); if(!hgl)break; void* pData=0; DWORD dwdResLen=::SizeofResource(0,hrsrc);
//блокируем буфер для совершения действий над ним if(dwdResLen && (pData=::LockResource(hgl))) { //pData - адрес буфера //dwdResLen - размер данных
//тут что то делаешь с данными - например копируешь или записываешь в файл //... }
break; }
//разблокируем ресурс, нам больше не нужно с ним работать if(hgl) { ::FreeResource(hgl); hgl=0; }
|
|
|
Записан
|
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #11 : 16-04-2009 18:22 » |
|
RuNTiME, я понял, спасибо. Еще непонятно как, собственно, проиграть музыку или нарисовать картинку из этих массивов данных? Алексей1153++, о и это тоже то что надо! добавь ресурс в дерево - Custom , обзови его, скажем "MYBIN" , дай идентификатор.
Затем щёлкни дважды этот ресурс в дереве объектов - он откроется (пока ещё чистый)
Затем. Открываешь в студии же нужный файл через File->Open (выбираешь OpenAS= binary ). Выделяй всё (ctrl+a) , копируй в буфер, вставляй в твой чистый ресурс. Открытый файл источник закрой от греха подальше, а ресурс - сохрани.
А как вот тоже самое только в express-студии? Resource view-а нету, да и OpenAS= binary не нашел (хотя может как раз это я просмотрел, но фалы .rc могу только в текстовом виде редактировать - ограничение ed - студии)
|
|
« Последнее редактирование: 16-04-2009 18:23 от Kultura »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 16-04-2009 18:31 » |
|
попробуй вручную всё вписать - сам файл у меня лежит в папке res , имя ему, скажем XXXX.bin в файле *.rc ///////////////////////////////////////////////////////////////////////////// // // MYBIN //
ID_... MYBIN DISCARDABLE "res\\XXXX.bin"
в resource.h #define ID_... 298 //подбери неповторный номер
|
|
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #13 : 16-04-2009 18:56 » |
|
Kultura, Кстати Express студия, тем и отличается, что там нету редактора ресурсов вообще (благополучно вырезан M$). Насчет проигрывания музыки и отображения рисунков из подобных ресурсов. Это сделать конечно сложнее, чем через стандартный способ. Тут надо смотреть в сторону библиотек, которые позволяют обрабатывать необходимые форматы файлов, только подсовывать им не файлы, а свои ресурсы. Кстати wav, можно проиграть через функции DirectSound, про это много написано статей на том же RSDN....
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #14 : 16-04-2009 19:07 » |
|
Алексей1153++, да вручную нормально. 2 вопроса
1) Как, например, XXXX.wav перекинуть в бинарный вид в XXXX.bin (пока что только тупо сменяется расширение и все) 2) Как XXXX.bin в программе проиграть (или если бинарник - картинка нарисовать)?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 16-04-2009 19:23 » |
|
1) а ты не сменяй расширение (да нехай он продолжает называться XXXX.wav ) 2) 2.a) сохранить в файл дальше - по логике 2.b) не сохранять в файл, а пользоваться уже загруженным в озу блоком данных (иногда ведь, при обработке файлов, загрузка в озу - это промежуточное действие. Вот с него и продолжить работу)
|
|
|
Записан
|
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #16 : 16-04-2009 19:27 » |
|
RuNTiME, там еще MFC ,ATL нету.
Впринципе, с этим способом понятно. Осталось только с bmp-шками разобраться.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #17 : 16-04-2009 19:28 » |
|
Осталось только с bmp-шками разобраться.
а что с ними ?
|
|
|
Записан
|
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #18 : 16-04-2009 19:34 » |
|
Алексей1153++, гмммм, а не проще ли оставить все как есть (wav bmp txt в отдельных папочках , используются по прямому назначению)? Эти файлы в виде ресурсов все равно находятся в отдельном месте У меня программка маленькая хочу все запхать в экзешник вот тогда будет хорошо
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #19 : 16-04-2009 19:35 » |
|
Kultura, конечно проще оставить всё как есть ) Разница будет только в количестве файлов в дистрибутиве и в возможности лёгкого редактирования файлов-ресурсов
|
|
|
Записан
|
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #20 : 16-04-2009 19:45 » |
|
а что с ними ?
см. 13-й пост Рантайма: Насчет проигрывания музыки и отображения рисунков из подобных ресурсов. Это сделать конечно сложнее, чем через стандартный способ. Тут надо смотреть в сторону библиотек, которые позволяют обрабатывать необходимые форматы файлов, только подсовывать им не файлы, а свои ресурсы. библиотеку надо искать что бы читать картинку-чудо-массив. p.s. Кстати, так и не понял, ну загрузил я ресурс свой (пусть бывший wav-файл) в озу через LoadResource и т.д., а дальше что? Мне же его надо проиграть пользователю при некоторых событиях, и как это сделать. 2.b) не сохранять в файл, а пользоваться уже загруженным в озу блоком данных (иногда ведь, при обработке файлов, загрузка в озу - это промежуточное действие. Вот с него и продолжить работу) Сохранить в файл в виде *.wav - это понятно, а в озу?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #21 : 16-04-2009 19:59 » |
|
>>библиотеку надо искать что бы читать картинку-чудо-массив. GDI+ , там Image (Джон подробнее расскажет ) проигрывание звука при помощи DirectSound - там всё равно придётся либо в озу грузить, либо проецировать файл для воспроизведения
|
|
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #22 : 16-04-2009 20:03 » |
|
Kultura, если ты загружаешь стандартным образом vaw файл (который по сути для компилятора ресурсов простой бинарник), то получишь тот-же указатель на массив байтов, со всеми внутренними структурами В плане bmp проще, компилятор ресурсов вытаскивает из него битовую карту и уже зашивает её. Для работы с бмп есть стандартные функции библиотеки GDI, типа LoadBitmap и ей подобные....
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #23 : 18-04-2009 17:19 » |
|
Ладно, это все хорошо, но есть еще текстовичек, содержимое которого может меняться. Изменения должны сохраняться до следующего запуска. Как с этим быть? Желательно-то все запрятать
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #24 : 18-04-2009 17:29 » |
|
Kultura, может это тебе поможет The UpdateResource function adds, deletes, or replaces a resource in an executable file.
Syntax
BOOL UpdateResource( HANDLE hUpdate, LPCTSTR lpType, LPCTSTR lpName, WORD wLanguage, LPVOID lpData, DWORD cbData ); Parameters
hUpdate [in] Specifies an update-file handle. This handle is returned by the BeginUpdateResource function. lpType [in] Pointer to a null-terminated string specifying the resource type to be updated. This parameter can also be an integer value passed to the MAKEINTRESOURCE macro, or it can be a predefined resource type. For a list of predefined resource types, see Resource Types. lpName [in] Pointer to a null-terminated string specifying the name of the resource to be updated. This parameter can also be an integer value passed to the MAKEINTRESOURCE macro. wLanguage [in] Specifies the language identifier of the resource to be updated. For a list of the primary language identifiers and sublanguage identifiers that make up a language identifier, see the macro. lpData [in] Pointer to the resource data to be inserted into the executable file. If the resource is one of the predefined types, the data must be valid and properly aligned. Note that this is the raw binary data stored in the executable file, not the data provided by LoadIcon, LoadString, or other resource-specific load functions. All data containing strings or text must be in Unicode format; lpData must not point to ANSI data.
If lpData is NULL, the specified resource is deleted from the executable file.
cbData [in] Specifies the size, in bytes, of the resource data at lpData. Return Value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
только файервол будет ругаться
|
|
|
Записан
|
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #25 : 19-04-2009 09:32 » |
|
Алексей1153++, поискал в гугле, вроде пишут, что нельзя менять ресурсы в самом себе во время исполнения. Но надо, конечно, проверить
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #26 : 19-04-2009 14:53 » |
|
Kultura, ну скорее всего оно так и есть (а ты попробовал?) Но можно скопировать самого себя и там подправить
|
|
|
Записан
|
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #27 : 20-04-2009 07:05 » |
|
Алексей1153++, да, попробовал, не получается. Вот тема: http://forum.sources.ru/index.php?showtopic=92327Там в 9-м сообщении о "Записи в StringTable". При попытке записи самому в себя BeginUpdateResource () возвращает 0 (видимо ошибка будет Could not open file for writing, хотя это не проверил). Если выполнить тоже самое, но указывать другой экзешник, все работает.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #28 : 20-04-2009 07:15 » |
|
Kultura, пусть файл сделает свою копию и туда записывает изменения. А при окончании работы пусть подменяет себя копией
собственно, как подменить: сделать в своей программе ключ, при запуске с которым программа смотрит параметры - что скоировать, куда скопировать. Копирует и завершается
например, exe1 создал копию (exe2) и записал туда что то. При выключении exe1 запускает exe2 как показано ниже и прекращает работу.
exe2 -copy "pathFrom....\exe2" "pathTo...\exe1"
exe2 удаляет "pathTo...\exe1" и копирует себя туда. Затем завершает работу
|
|
|
Записан
|
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #29 : 20-04-2009 08:29 » |
|
Алексей1153++, хорошо, я понял, спасибо. Решена проблема со звуком. Все оказалось очень просто: 1) Создаем массивы по методу RuNTiME2) Работу со звуком я оформил так: // MyResources.cpp #include "stdafx.h" #include "MyResources.h"
const char * GetSoundResource (int sound) { switch (sound) { case IDS_XXX: { static const unsigned char xxxSound [XXX_LEN] = { ... // Сгенерированный массив }; return ((char *) xxxSound); } case IDS_... {} // И так далее } } // MyResources.h const char * GetSoundResource (int sound);
(хотя было мнение сделать каждый ресурс в своем файле, может быть - так лучше) 3) sndPlaySound ((LPCWSTR) GetSoundResource (sound), SND_MEMORY | SND_ASYNC); Раньше был PlaySound (), так что это самый простой случай Для каких-то более сложных операций можно еще посмотреть Waveform Audio в мсдн.
|
|
« Последнее редактирование: 20-04-2009 08:39 от Kultura »
|
Записан
|
|
|
|
|