Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2013, 13:45   #1
deniscatch
Пользователь
 
Регистрация: 06.09.2013
Сообщений: 25
По умолчанию ресурсы rc

Не могу разобраться как работать с ресурсами. И так, все по порядку.
Я установил MinGW компилятор.
Теперь я хочу чтобы при запуске консольного приложения заиграла музыка.
Есть wav файл, который нормально проигрывается. Но мне надо запихнуть музыку в exe.
Подскажите как это сделать чайнику. Прошу объяснить подробно и без сокращений и сленга :-)
Приведите пример файлов. (main.cpp, заголовков и прочего)
Я реально ушел в депресняк от этого дела, притом уже который день...
deniscatch вне форума Ответить с цитированием
Старый 07.09.2013, 15:37   #2
deniscatch
Пользователь
 
Регистрация: 06.09.2013
Сообщений: 25
По умолчанию

Разве никто никогда не вталкивал свои ресурсы в exe?
deniscatch вне форума Ответить с цитированием
Старый 07.09.2013, 19:12   #3
Vladiger
Пользователь
 
Регистрация: 31.08.2013
Сообщений: 93
По умолчанию

Файл ресурсов Main.rc:
Код:
#include "Resource.h"

#define APSTUDIO_READONLY_SYMBOLS
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS
#undef APSTUDIO_READONLY_SYMBOLS

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
#ifdef _WIN32
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
#endif

//----------------------------------------
// Звуки
//----------------------------------------
IDI_SOUND_WAVE WAVE	"introsong.wav"
IDI_SOUND_MP3 RCDATA	"introsong.mp3"

#endif
Заголовочный файл ресурсов Resource.h:
Код:
#define IDI_SOUND_WAVE		101
#define IDI_SOUND_MP3		102

Основной код Main.cpp:
Код:
#include <windows.h>
#include "Resource.h"

#pragma comment(lib, "winmm.lib")

int main() {

	PlaySound(MAKEINTRESOURCE(IDI_SOUND_WAVE), NULL, SND_RESOURCE | SND_ASYNC | SND_LOOP);

	system("pause");
	return 0;
}
Vladiger вне форума Ответить с цитированием
Старый 07.09.2013, 19:37   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

музыка в ресурсах - спорный момент
в стандарте С++ ресурсы не описаны, для работы с ними нужны дополнительные библиотеки.

Библиотека Qt вроде бы не позволяет засовывать звуки в исполняемый файл (это обосновано, т.к. не всегда и не все ресурсы используются в программе, а при загрузке исполняемого файла все ресурсы попадают в память. Музыка занимает большое количество памяти, поэтому засовывать ее в исполняемый файл не очень хорошо).
rrrFer вне форума Ответить с цитированием
Старый 07.09.2013, 20:18   #5
Vladiger
Пользователь
 
Регистрация: 31.08.2013
Сообщений: 93
По умолчанию

Абсалютно согласен со всем вышесказанным.
Пихать 50 мегобайт любимой мелодии WAV в экзешник: - Ну я не знаю, зачем?

Просто тут есть вопрос - есть ответ. Возможно ли такое? Да, возможно, выше приведен пример. А все остальное хозяин сам будет обдумывать. Но лично я никогда бы не запихал музыку в ресурсы. Не нужна она там.
Vladiger вне форума Ответить с цитированием
Старый 07.09.2013, 20:26   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Библиотека Qt вроде бы не позволяет засовывать звуки в исполняемый файл
Как ресурсы вообще связаны с библиотекой?
Цитата:
Сообщение от rrrFer Посмотреть сообщение
не всегда и не все ресурсы используются в программе, а при загрузке исполняемого файла все ресурсы попадают в память
В адресное пространство. Что не используется, то вряд ли в памяти окажется.
Цитата:
Сообщение от Vladiger Посмотреть сообщение
Пихать 50 мегобайт любимой мелодии WAV в экзешник: - Ну я не знаю, зачем?
Если серьёзная программа и большой файл - то, конечно, нехорошо. А если по мелочи - почему бы и нет?
А если ещё и не wav, а что-нибудь помельче - mod, xm... Тогда можно вообще в секции данных в массив, чтобы ресурсы не плодить.

Последний раз редактировалось Somebody; 07.09.2013 в 20:30.
Somebody вне форума Ответить с цитированием
Старый 07.09.2013, 20:48   #7
Vladiger
Пользователь
 
Регистрация: 31.08.2013
Сообщений: 93
По умолчанию

С WAV файлом проще. WinAPI функция PlaySound() предусматривает воспроизведение потока из памяти, а вот с медиафайлами сложнее.
Я как то искал так же в гугле способ создания потока из памяти для MP3 при помощи Direct Show, но так и не нашел... Везде много слов, что такое возможно и.т.д и.т.п и "бла бла бла бла", но рабочий пример в виде C++ кода так и не видел.

Может кто знает как создать этот поток для IID_IGraphBuilder?

Проиграть медиафайл с диска просто:

Код:
#include <dshow.h>

#pragma comment(lib, "strmiids.lib")

int main() {

	LPCWSTR strFileName = L"introsong.mp3";
	IGraphBuilder *pGraph = NULL;
	IMediaControl *pControl = NULL;
	IMediaEvent *pEvent = NULL;

	HRESULT hr = CoInitialize(NULL);
	if (FAILED(hr)) return 0;
	hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
	if (FAILED(hr)) return 0;
	hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
	hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
	hr = pGraph->RenderFile(strFileName, NULL);
	if (SUCCEEDED(hr)) {
		hr = pControl->Run();
		if (SUCCEEDED(hr)) {
			wprintf(L"Play %s", strFileName);
			long evCode;
			pEvent->WaitForCompletion(INFINITE, &evCode);
		}
	}
	pControl->Release();
	pEvent->Release();
	pGraph->Release();
	CoUninitialize();

	return 0;
}
А как из памяти?
Vladiger вне форума Ответить с цитированием
Старый 07.09.2013, 21:48   #8
deniscatch
Пользователь
 
Регистрация: 06.09.2013
Сообщений: 25
По умолчанию

Я хотел примерно увидеть то, что написал в первом ответе Vladiger.
Когда я попытался откомпилировать, то получил ошибку
Код:
C:\Program Files (x86)\MinGWStudio\MinGW\bin\windres.exe: preprocessing failed.
Linking...
g++.exe: \Documents\MinGW Studio Projects\Twilight\Debug\Main.res: No such file or directory
В чем ошибка? вот тот код
Цитата:
Файл ресурсов Main.rc:
Код:


#include "Resource.h"

#define APSTUDIO_READONLY_SYMBOLS
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS
#undef APSTUDIO_READONLY_SYMBOLS

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
#ifdef _WIN32
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
#endif

//----------------------------------------
// Звуки
//----------------------------------------
IDI_SOUND_WAVE WAVE "introsong.wav"
IDI_SOUND_MP3 RCDATA "introsong.mp3"

#endif

Заголовочный файл ресурсов Resource.h:
Код:


#define IDI_SOUND_WAVE 101
#define IDI_SOUND_MP3 102


Основной код Main.cpp:
Код:


#include <windows.h>
#include "Resource.h"

#pragma comment(lib, "winmm.lib")

int main() {

PlaySound(MAKEINTRESOURCE(IDI_SOUND _WAVE), NULL, SND_RESOURCE | SND_ASYNC | SND_LOOP);

system("pause");
return 0;
}

Последний раз редактировалось deniscatch; 07.09.2013 в 21:58.
deniscatch вне форума Ответить с цитированием
Старый 07.09.2013, 22:14   #9
Vladiger
Пользователь
 
Регистрация: 31.08.2013
Сообщений: 93
По умолчанию

Ошибка вот в этой строчке, которую компилятор сообщает в случае ошибки:
Цитата:
g++.exe: \Documents\MinGW Studio Projects\Twilight\Debug\Main.res: No such file or directory
Обратите внимание на No such file or directory - это означает что файл ресурсов просто не найден компилятором.
Проверьте его наличие в дирректории проекта, а так же его имя. Меня смутило почему Main.res, а не Main.rc?
А так же эти файлы Main.rc, Resource.h, Main.cpp все должны быть включены в проект.
Я другим компилятором пользуюсь Visual Express 2008, так что не могу пошагово расписать для MinGW, но принцип то у всех компиляторов похожий.
Ищите в свойствах проекта что то типа: - "Добавить файл" или "Добавить элемент"...

В общем ошибка не в коде, а в настройках проекта который Вы пытаетесь скомпилировать.

Последний раз редактировалось Vladiger; 07.09.2013 в 22:19.
Vladiger вне форума Ответить с цитированием
Старый 07.09.2013, 22:41   #10
deniscatch
Пользователь
 
Регистрация: 06.09.2013
Сообщений: 25
По умолчанию

Vladiger, можно Вас попросить об одолжении? Скачайте пожалуйста MinGW, он бесплатный и весит копейки, и попробуйте откомпилировать этот код. У вас больше опыта, вы бы могли меня очень выручить. Я чувствую, что у меня уже личные счеты с этим компилятором.
deniscatch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ресурсы StartMis Общие вопросы Delphi 11 16.07.2010 12:03
Ресурсы JeyKip Win Api 2 11.04.2010 10:26
Ресурсы VladimirVB Win Api 3 23.08.2009 12:47
Ресурсы Witaliy Общие вопросы Delphi 1 27.04.2008 17:40
Ресурсы, зачем нужны ресурсы Hallo Обсуждение статей 0 12.12.2006 21:30