Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Размещение файлов в экзешнике  (Прочитано 52538 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kultura
Помогающий

ru
Offline Offline

« : 16-04-2009 12:22 » 

В игре (WinAPI & Visual C++) используется несколько файлов *.bmp, *.txt и *.wav (не слишком много).

Есть желание эти файлы разместить (скрыть) в экзешнике. Подскажите, как это сделать?
Записан
Джон
просто
Администратор

de
Offline 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
Помогающий

ru
Offline Offline

« Ответ #2 : 16-04-2009 14:55 » 

Да, наверное, могут.

Хотя txt-шник меняется, а изменять свой ресурс при исполнении, вроде, нельзя.

Хорошо, пусть будет часть дела. Подскажите, как целиком разместить *.bmp и *.wav - файлы в ресурсах?
Записан
Джон
просто
Администратор

de
Offline 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
Помогающий

ru
Offline Offline

« Ответ #4 : 16-04-2009 15:35 » 

2008, express edition.

Объясните подробнее про BMP и музыку. В гугле не нашлось  Скромно так...
За BMP знаю прописывать их в виде [*** BITMAP PATH], потом загружать, но сами файлы должны лежать отдельно.
Записан
Джон
просто
Администратор

de
Offline 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
Помогающий

ru
Offline 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
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 16-04-2009 16:30 » 

Kultura, Есть один способ, как поместить в исполняемый файл любые данные и потом обращаться к ним. Для этого не нужно пользоваться стандартным компилятором ресурсов. Способ очень прост, берётся обычный шеснадцатеричный редактор к примеру WinHex с возможностью экспорта данных в код на С++. Открывается в нем нужный файл и экспортируется. На выходе получаем обычный массив, который компилируется любым компилятором на любой системе.
Записан

Любимая игрушка - debugger ...
Kultura
Помогающий

ru
Offline Offline

« Ответ #8 : 16-04-2009 17:24 » 

RuNTiME, отличный способ, спасибо! Для чего-нибудь маленького в самый раз.
Но массив на 100 тыс. строк - это жесть, первый раз увидел *.cpp файл на несколько мегабайт  Жжешь

А что дальше с этими массивами делать (для *.bmp и *.wav)?  Здесь была моя ладья...
Для *.bmp - это ж не только массив точек, наверное, еще служебная инфа, как отделить?
Для  *.wav вовсе без понятия
« Последнее редактирование: 16-04-2009 17:40 от Kultura » Записан
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #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 ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Помогающий

ru
Offline 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 » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 16-04-2009 18:56 » 

Kultura, Кстати Express студия, тем и отличается, что там нету редактора ресурсов вообще Улыбаюсь (благополучно вырезан M$). Насчет проигрывания музыки и отображения рисунков из подобных ресурсов. Это сделать конечно сложнее, чем через стандартный способ. Тут надо смотреть в сторону библиотек, которые позволяют обрабатывать необходимые форматы файлов, только подсовывать им не файлы, а свои ресурсы. Кстати wav, можно проиграть через функции DirectSound, про это много написано статей на том же RSDN....
Записан

Любимая игрушка - debugger ...
Kultura
Помогающий

ru
Offline Offline

« Ответ #14 : 16-04-2009 19:07 » 

Алексей1153++, да вручную нормально. 2 вопроса

1) Как, например, XXXX.wav перекинуть в бинарный вид в XXXX.bin (пока что только тупо сменяется расширение и все)
2) Как XXXX.bin в программе проиграть (или если бинарник - картинка нарисовать)?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 16-04-2009 19:23 » 

1) а ты не сменяй расширение Ага
  (да нехай он продолжает называться  XXXX.wav Улыбаюсь )

2)
   2.a) сохранить в файл
        дальше - по логике

   2.b) не сохранять в файл, а пользоваться уже загруженным в озу блоком данных (иногда ведь, при обработке файлов, загрузка в озу - это промежуточное действие. Вот с него и продолжить работу)
Записан

Kultura
Помогающий

ru
Offline Offline

« Ответ #16 : 16-04-2009 19:27 » 

RuNTiME, там еще MFC ,ATL нету.

Впринципе, с этим способом понятно. Осталось только с bmp-шками разобраться.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 16-04-2009 19:28 » 

Осталось только с bmp-шками разобраться.

а что с ними ?
Записан

Kultura
Помогающий

ru
Offline Offline

« Ответ #18 : 16-04-2009 19:34 » 

Алексей1153++, гмммм, а не проще ли оставить все как есть (wav bmp txt в отдельных папочках , используются по прямому назначению)?  Здесь была моя ладья...
Эти файлы в виде ресурсов все равно находятся в отдельном месте
У меня программка маленькая хочу все запхать в экзешник вот тогда будет хорошо  Да-да
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #19 : 16-04-2009 19:35 » 

Kultura, конечно проще оставить всё как есть ) Разница будет только в количестве файлов в дистрибутиве и в возможности лёгкого редактирования файлов-ресурсов Улыбаюсь
Записан

Kultura
Помогающий

ru
Offline Offline

« Ответ #20 : 16-04-2009 19:45 » 

а что с ними ?

см. 13-й пост Рантайма:

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

библиотеку надо искать что бы читать картинку-чудо-массив.

p.s. Кстати, так и не понял, ну загрузил я ресурс свой (пусть бывший wav-файл) в озу через LoadResource и т.д., а дальше что? Мне же его надо проиграть пользователю при некоторых событиях, и как это сделать.

Цитата
2.b) не сохранять в файл, а пользоваться уже загруженным в озу блоком данных (иногда ведь, при обработке файлов, загрузка в озу - это промежуточное действие. Вот с него и продолжить работу)

Сохранить в файл в виде *.wav - это понятно, а в озу?

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #21 : 16-04-2009 19:59 » 

>>библиотеку надо искать что бы читать картинку-чудо-массив.
GDI+ , там Image (Джон подробнее расскажет Улыбаюсь )

проигрывание звука при помощи DirectSound - там всё равно придётся либо в озу грузить, либо проецировать файл для воспроизведения
Записан

RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 16-04-2009 20:03 » 

Kultura, если ты загружаешь стандартным образом vaw файл (который по сути для компилятора ресурсов простой бинарник), то получишь тот-же указатель на массив байтов, со всеми внутренними структурами Улыбаюсь В плане bmp проще, компилятор ресурсов вытаскивает из него битовую карту и уже зашивает её. Для работы с бмп есть стандартные функции библиотеки GDI, типа LoadBitmap и ей подобные....
Записан

Любимая игрушка - debugger ...
Kultura
Помогающий

ru
Offline Offline

« Ответ #23 : 18-04-2009 17:19 » 

Ладно, это все хорошо, но есть еще текстовичек, содержимое которого может меняться. Изменения должны сохраняться до следующего запуска. Как с этим быть?
Желательно-то все запрятать   Да-да
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Помогающий

ru
Offline Offline

« Ответ #25 : 19-04-2009 09:32 » 

Алексей1153++, поискал в гугле, вроде пишут, что нельзя менять ресурсы в самом себе во время исполнения. Но надо, конечно, проверить
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #26 : 19-04-2009 14:53 » 

Kultura, ну скорее всего оно так и есть (а ты попробовал?) Но можно скопировать самого себя и там подправить
Записан

Kultura
Помогающий

ru
Offline 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, хотя это не проверил).
Если выполнить тоже самое, но указывать другой экзешник, все работает.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 20-04-2009 07:15 » 

Kultura,
пусть файл сделает свою копию и туда записывает изменения. А при окончании работы пусть подменяет себя копией

собственно, как подменить: сделать в своей программе ключ, при запуске с которым программа смотрит параметры - что скоировать, куда скопировать. Копирует и завершается

например, exe1 создал копию (exe2) и записал туда что то. При выключении exe1 запускает exe2 как показано ниже и прекращает работу.

exe2 -copy "pathFrom....\exe2" "pathTo...\exe1"

exe2 удаляет "pathTo...\exe1" и копирует себя туда. Затем завершает работу
Записан

Kultura
Помогающий

ru
Offline Offline

« Ответ #29 : 20-04-2009 08:29 » 

Алексей1153++, хорошо, я понял, спасибо.

Решена проблема со звуком.
Все оказалось очень просто:

1) Создаем массивы по методу RuNTiME
2) Работу со звуком я оформил так:

Код:
// 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 » Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines