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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2008, 20:16   #1
Beket
Новичок
Джуниор
 
Регистрация: 15.09.2008
Сообщений: 2
По умолчанию MPQ архивы. вопрос...

Всем привет! Есть вопрос по MPQ архивам (в такие компания Blizzard упаковывает свои игры). Так вот есть у меня один вопрос:
В инете можно легко найти кучу функций для работы с таковыми. Мне нужно написать кусок кода, который открывает архив, некий patch-6.MPQ и файл, некий World\Maps\Kalimdor\Kalimdor.adt (обязательно в таком виде... у меня в программе это древо сразу хранится в переменной так что всё уже схвачено =) ). Так вот нужно чтобы код сначала проверял нет ли в архиве такого файла и в противном случае удаляла старый и записывала на его место вот этот самый Kalimdor.adt либо (если такового не было в архиве) сразу его туда добавляла!

Я просто очень мало знаком с работой архивов так что прошу помощи у специалистов! =)

Естественно на с++

Последний раз редактировалось Beket; 16.09.2008 в 03:13.
Beket вне форума Ответить с цитированием
Старый 16.09.2008, 00:43   #2
Beket
Новичок
Джуниор
 
Регистрация: 15.09.2008
Сообщений: 2
По умолчанию

Вот, например, нашёл библиотеку http://www.zezula.net/en/mpq/stormdll.html
Но вот как мне её проюзать?
Beket вне форума Ответить с цитированием
Старый 17.09.2008, 09:39   #3
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Я скачал по указанной вами ссылке архив stormlib.zip, а в нем обнаружил уже скомпилированную библиотеку stormlib.dll, которую, понятно, надо положить в каталог к исполняемому файлу, а так же заголовочный файл StormDll.h, в котором объявлены прототипы необходимых функций, в частности:
SFileOpenArchive(LPCSTR lpFileName, DWORD dwPriority, DWORD dwFlags, HANDLE *hMPQ); - дання функция используется для открытия файла-архива, пример:

Код:
HANDLE hMPQ; /*Хендл на наш файл, его можно использовать для 
обращения к открытому файлу и манипуляций с ним, с помощью 
других функций*/
SFileOpenArchive("C:\test.mpq", 0, 0, &hMPQ); //Открываем файл
Данная функция возвращает true, в случае успешного открытия архива и false, в случае неудачи.
Так же есть функции:
SFileCloseArchive)(HANDLE hMPQ); - закрывает открытый архив.
SFILE(GetFileArchive)(HANDLE hFile, HANDLE *hMPQ); - позволяет обратиться к конкретному файлу в архиве, через его хендл, функция так же возвращает логический результат.
Естественно не забываем в начале программы #include "StormDll.h"
Работу этих функция я не проверял, т.к. у меня нет ни одного mpq файла.
Вообще в скачанном архиве очень много исходников, как самой библиотеки, так и программ, демонстрирующих работу с этой библиотекой, а так же приводится описание формата mpq файла.
oleg kutkov вне форума Ответить с цитированием
Старый 27.02.2009, 18:38   #4
Smitt64
 
Аватар для Smitt64
 
Регистрация: 27.02.2009
Сообщений: 5
По умолчанию

почитай тему "Использование MPQ архивов". Я правда там токо про чтение файла из архива написал, но все таки вдруг пригодится.

Я там использовал не Storm.dll, а SFmpq.dll там есть функции для обновления файлов:
Код:
MPQHANDLE SFMPQAPI WINAPI MpqOpenArchiveForUpdate(LPCSTR lpFileName, DWORD dwFlags, DWORD dwMaximumFilesInArchive);
DWORD SFMPQAPI WINAPI MpqCloseUpdatedArchive(MPQHANDLE hMPQ, DWORD dwUnknown2);
BOOL SFMPQAPI WINAPI MpqAddFileToArchive(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags);
BOOL SFMPQAPI WINAPI MpqAddWaveToArchive(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags, DWORD dwQuality);
BOOL SFMPQAPI WINAPI MpqRenameFile(MPQHANDLE hMPQ, LPCSTR lpcOldFileName, LPCSTR lpcNewFileName);
BOOL SFMPQAPI WINAPI MpqDeleteFile(MPQHANDLE hMPQ, LPCSTR lpFileName);
BOOL SFMPQAPI WINAPI MpqCompactArchive(MPQHANDLE hMPQ);

// Extra archive editing functions
BOOL SFMPQAPI WINAPI MpqAddFileToArchiveEx(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags, DWORD dwCompressionType, DWORD dwCompressLevel);
BOOL SFMPQAPI WINAPI MpqAddFileFromBufferEx(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags, DWORD dwCompressionType, DWORD dwCompressLevel);
BOOL SFMPQAPI WINAPI MpqAddFileFromBuffer(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags);
BOOL SFMPQAPI WINAPI MpqAddWaveFromBuffer(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags, DWORD dwQuality);
BOOL SFMPQAPI WINAPI MpqSetFileLocale(MPQHANDLE hMPQ, LPCSTR lpFileName, LCID nOldLocale, LCID nNewLocale);

Последний раз редактировалось Smitt64; 28.02.2009 в 18:09.
Smitt64 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10
Вопрос Mitron О форуме и сайтах клуба 1 11.02.2008 06:26
WoW - вопрос PAVEL315 Свободное общение 2 05.02.2008 20:51
вопрос про ADO Cantana Помощь студентам 14 12.09.2007 15:33