Страница 1 из 2
компоновать текстовый файл ресурсов с исполняемым файлом Visual Studio
Добавлено: 12 июн 2010, 13:36
FloyDos
Подскажите, пожалуйста, как "вживить" текстовый файл ресурсов в экзешник.
Находил что-то вроде resgen, но затем как я понял нужно считывать какими-то определенными функциями.
Не охота переделывать код
Код: Выделить всё
CStdioFile source;
source.Open(sourcename,CStdioFile::modeRead);
while(source.ReadString(tmpstr))
{
vec.push_back(tmpstr);
}
Можно ли использовать ресурсы (или какие ресурсы можно использовать - res, resx, или еще что-то) как обычные файлы?
Re: компионовать текстовый файл ресурсов с исполняемым файлом Visual Studio
Добавлено: 13 июн 2010, 23:23
Romeo
Как обычный файл ресурсы использовать нельзя. Могу рассказать, как добавить текстовый файл в ресурсы и как его потом из них вычитать.
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.
Re: компионовать текстовый файл ресурсов с исполняемым файлом Visual Studio
Добавлено: 14 июн 2010, 20:09
FloyDos
спасибо.
вот что выдает:
e:\....\resuu.rc(202): error RC2169 : resource file res\L-list.txt is not in 2.03 format
а то что вы посоветовали насчет ID - там нужна LPCSTR переменная, на ID выдает ошибку несоответсвия типов
Re: компионовать текстовый файл ресурсов с исполняемым файлом Visual Studio
Добавлено: 14 июн 2010, 21:37
FloyDos
Код: Выделить всё
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);
выводит ерунду какую-то.. че делать???
Re: компионовать текстовый файл ресурсов с исполняемым файлом Visual Studio
Добавлено: 14 июн 2010, 22:22
Decoder
Re: компионовать текстовый файл ресурсов с исполняемым файлом Visual Studio
Добавлено: 14 июн 2010, 23:19
FloyDos
LPVOID res = LockResource (LockResource);
мне страшно. что-то сегодня голова чужая /*сорри за оффтоп*/
Re: компионовать текстовый файл ресурсов с исполняемым файлом Visual Studio
Добавлено: 15 июн 2010, 01:37
Romeo
Совершенно верно. Кака здесь нездоровая наблюдается. Должно быть вот так:
Re: компионовать текстовый файл ресурсов с исполняемым файлом Visual Studio
Добавлено: 15 июн 2010, 19:37
FloyDos
Один черт очевидно, что текст выгружает и вуаля:
Дело в кодировке??? А непонятно, почему так.. Уже вместо char буфер wchar_t...
Re: компионовать текстовый файл ресурсов с исполняемым файлом Visual Studio
Добавлено: 15 июн 2010, 19:57
FloyDos
Код: Выделить всё
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);
Re: компионовать текстовый файл ресурсов с исполняемым файлом Visual Studio
Добавлено: 15 июн 2010, 23:02
Romeo
Строки:
Код: Выделить всё
char *t=new char [dwSize]; //= (char *)res;
t= (char* )res;
Замени на:
Получишь то же самое и ко всему прочему избавишься от memory leak;
И ещё обязательно сделай
FreeResource в конце, я же подчеркнул это. А то снова получишь memory leak (на этот раз уже памяти, в которую был загружен ресурс)