компионовать текстовый файл ресурсов с исполняемым файлом Visual Studio

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

FloyDos
Сообщения: 25
Зарегистрирован: 14 июн 2009, 16:08

Подскажите, пожалуйста, как "вживить" текстовый файл ресурсов в экзешник.

Находил что-то вроде resgen, но затем как я понял нужно считывать какими-то определенными функциями.
Не охота переделывать код

Код: Выделить всё

CStdioFile source;
source.Open(sourcename,CStdioFile::modeRead);
			while(source.ReadString(tmpstr))
			{
			  vec.push_back(tmpstr);
			}
Можно ли использовать ресурсы (или какие ресурсы можно использовать - res, resx, или еще что-то) как обычные файлы?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Как обычный файл ресурсы использовать нельзя. Могу рассказать, как добавить текстовый файл в ресурсы и как его потом из них вычитать.

1. Добавляем текстовый файл в ресурсы (Студия при этом добавляет соответствующую записть в rc файл и генерирует для ресурса специальный ID). Предположим ресурс получил ID = IDR_TEXT_FILE.
2. Вызываем API функцию FindResource (передаём туда хэндлер процесса, IDR_TEXT_FILE и тип ресурса - мы его задавали при добавлении ресурса). Получем хэнлер ресурса.
3. Вызываем API функцию LoadResource (передаём туда хэндлер процесса и хэнлер ресурса, который получили на шаге 2. Получаем указатель на глобальные данные типа HGLOBAL.
4. Вызываем API функцию LockResource (передаём туда HGLOBAL). Данная функция возвращает уже реальный указатель на память, где лежит текстовый файл. То есть этот указатель можно приведением типа привести например к const char* и работать с эти указателем, как со строкой, хранящей всё содержимое файла.
5. После того, как поработали с ресурсом следует обязательно вызывать API функцию FreeResource, передав туда HGLOBAL, полученный на шаге 3.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
FloyDos
Сообщения: 25
Зарегистрирован: 14 июн 2009, 16:08

спасибо.

Код: Выделить всё

FindResource(0,"res\L-list.txt","1");
вот что выдает:

e:\....\resuu.rc(202): error RC2169 : resource file res\L-list.txt is not in 2.03 format

а то что вы посоветовали насчет ID - там нужна LPCSTR переменная, на ID выдает ошибку несоответсвия типов
FloyDos
Сообщения: 25
Зарегистрирован: 14 июн 2009, 16:08

Код: Выделить всё

	HRSRC resHandler = FindResource(0,L"res\text1.bin",L"text");
	HGLOBAL hGlobal = LoadResource(0,resHandler);
	LPVOID res = LockResource (LockResource);
	char *t = (char *)res;
	MessageBox((LPCTSTR)t);
выводит ерунду какую-то.. че делать???
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Похожая тема когда-то обсуждалась на этом форуме,,,
http://forum.developing.ru/showthread.p ... 2-RichEdit
Поумнеть несложно, куда труднее от дури избавиться.
FloyDos
Сообщения: 25
Зарегистрирован: 14 июн 2009, 16:08

LPVOID res = LockResource (LockResource);
мне страшно. что-то сегодня голова чужая /*сорри за оффтоп*/
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Совершенно верно. Кака здесь нездоровая наблюдается. Должно быть вот так:

Код: Выделить всё

LPVOID res = LockResource (hGlobal);
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
FloyDos
Сообщения: 25
Зарегистрирован: 14 июн 2009, 16:08

Один черт очевидно, что текст выгружает и вуаля:
Изображение

Дело в кодировке??? А непонятно, почему так.. Уже вместо char буфер wchar_t...
FloyDos
Сообщения: 25
Зарегистрирован: 14 июн 2009, 16:08

Код: Выделить всё

	HRSRC resHandler = NULL;
	resHandler = FindResource(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_TXT2),L"TXT");
	HGLOBAL hGlobal = LoadResource(AfxGetInstanceHandle(),resHandler);
	LPVOID res = LockResource (hGlobal);
	DWORD dwSize = SizeofResource(AfxGetInstanceHandle(), resHandler); // размер нашего файла
	char *t=new char [dwSize]; //= (char *)res;
	t= (char* )res;
	MessageBox((LPCTSTR)t);
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Строки:

Код: Выделить всё

char *t=new char [dwSize]; //= (char *)res;
t= (char* )res;
Замени на:

Код: Выделить всё

char *t = (char* )res;
Получишь то же самое и ко всему прочему избавишься от memory leak;

И ещё обязательно сделай FreeResource в конце, я же подчеркнул это. А то снова получишь memory leak (на этот раз уже памяти, в которую был загружен ресурс)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить