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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2009, 16:54   #1
DarkElf_89
Пользователь
 
Регистрация: 05.09.2009
Сообщений: 22
По умолчанию Работа с MPQ архивами. Библиотека Stormlib.dll

Привет всем! Огромная просьба откликнуться тем, кто когда-нибудь работал с MPQ архивами (в них Blizzard упаковывает ресурсы своих игр). Я пробовал работать с библиоткой SFmpq, читал все темы и статьи на этом форуме, но так оказалось что с архивами WoW WOTLK она не работает ... Потом остановился на Stormlib, тут тоже свои проблемы, короче вот код :
Код:
 HANDLE m;
 HANDLE hf;
 if (!SFileOpenArchive(f_name,NULL,NULL,&m)){
  ... //здесь вывожу сообщение об ошибке, выхожу из функции
 }
 if(!SFileOpenFileEx(m,f2name,NULL,&hf)){
  ... //тоже сообщение об ошибке
 }else{
 char buf[1000000000];
 unsigned long b;
 SFileReadFile(hf,buf,sizeof(buf),&b,NULL);
 ...
 }
причем SFileOpenFileEx возвращает истину, т.е. файл открывается нормально, но при попытке прочитать данные из файла SFileReadFile в переменной b всегда 0 (я так понимаю что это количество байт которое прочитано из файла). В чем может проблема? Уже неделю мучаюсь с этими библиотеками, весь интернет перерыл-толку 0... Помогите плиз! Да, еще, пишу в билдере...
DarkElf_89 вне форума Ответить с цитированием
Старый 05.09.2009, 17:04   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

По поводу чтения, боюсь, ничего сказать не могу, но что посоветую, так это не выделять такое обилие данных в стеке, лучше уж тогда использовать оператор new для выделения динамической памяти из кучи:
Код:
char* buf = new char[1000000000];
...
SFileReadFile(hf, buf, 1000000000, &b, NULL); // sizeof(buf) уже использовать нельзя, так как это теперь лишь указатель.
...
delete[] buf;
для удобства можно размер массива определить в виде константы или макроса:
Код:
const int BUFFER_SIZE = 1000000000;
// Или 
#define BUFFER_SIZE 1000000000
netrino вне форума Ответить с цитированием
Старый 05.09.2009, 22:16   #3
Kopwyh
НашКодинг
 
Регистрация: 21.05.2009
Сообщений: 9
По умолчанию

Насколько я знаю логику таких команд, они возвращают необходимый размер буфера.
Попробуй так:
Код:
 HANDLE m;
 HANDLE hf;
 if (!SFileOpenArchive(f_name,NULL,NULL,&m)){
  ... //здесь вывожу сообщение об ошибке, выхожу из функции
 }
 if(!SFileOpenFileEx(m,f2name,NULL,&hf)){
  ... //тоже сообщение об ошибке
 }else{
 char buf[1000000000];
 unsigned long b, c;
 с = SFileReadFile(hf,buf,sizeof(buf),&b,NULL);
 if (b == 0 && с > 0) 
{
char *buf1 = new char[c];
...  
}
else
{
// Ашипка! с, errno - такой-то.
}
Kopwyh вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
библиотека bass.dll, что это такое? дайте ссылку на хелп. vitalik007 Общие вопросы Delphi 2 29.02.2012 18:03
библиотека bass.dll larry Win Api 2 31.07.2009 15:37
Работа с архивами Acro Microsoft Office Excel 1 27.11.2008 13:04
Библиотека классов != обычная DLL ? darkstarx Общие вопросы .NET 3 14.04.2008 14:41
HTW32PAS.DLL необходима эта библиотека lekaon Свободное общение 4 21.08.2007 19:14