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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2009, 18:18   #1
Smitt64
 
Аватар для Smitt64
 
Регистрация: 27.02.2009
Сообщений: 5
Сообщение Использование MPQ архивов

Для работы потребуется библиотека SFmpq.dll(http://depositfiles.com/files/u9fmoupce, http://letitbit.net/download/48b80d2...m-dll.rar.html)

Без лишних слов:
Код:
void ExtractMPQFile(char *mpq,char *file, char *newFile);
DWORD GetMPQFileSize(char *mpq,char *file);
char *LoadFromMPQ(char *mpq,char *file);
я написал 3 функции на основе этой библиотеки: извлечение файла из архива, получение размера файла и загрузка файла из архива в переменную - буфер.

SFmpq содержит следующие функции которые я использовал:
BOOL SFMPQAPI WINAPI SFileOpenArchive(LPCSTR lpFileName, DWORD dwPriority, DWORD dwFlags, MPQHANDLE *hMPQ) - открывает архив для чтения(если не удалось открыть false, иначе true)
BOOL SFMPQAPI WINAPI SFileCloseArchive(MPQHANDLE hMPQ) - соответственно закрывает архив
BOOL SFMPQAPI WINAPI SFileOpenFile(LPCSTR lpFileName, MPQHANDLE *hFile) - открывает файл в архиве для чтения(если не удалось открыть или файла нет false, иначе true)
BOOL SFMPQAPI WINAPI SFileCloseFile(MPQHANDLE hFile) - соответственно закрывает файл
DWORD SFMPQAPI WINAPI SFileGetFileSize(MPQHANDLE hFile, LPDWORD lpFileSizeHigh) - возвращает размер указанного файла в байтах.
BOOL SFMPQAPI WINAPI SFileReadFile(MPQHANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped) - читает файл в буфер
----------------------------------------------------------------------------------------------

Код:
void ExtractMPQFile(char *mpq,char *file, char *newFile)
{
	HANDLE hMpq=NULL;//MPQ архив
	HANDLE hFile=NULL;//MPQ файл

	if(!SFileOpenArchive(mpq,NULL,NULL,&hMpq))//если не удалось открыть архив, выход из функции
		return;

	if(!SFileOpenFile(file,&hFile))//если не удалось открыть файл, выход из функции
		return;

	HANDLE hNewFile=CreateFile(newFile,GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
	char  szBuffer[0x10000];
    DWORD dwBytes = 1;

    while(dwBytes > 0)
    {
		SFileReadFile(hFile, szBuffer, sizeof(szBuffer), &dwBytes, NULL);//читаем байты в буффер из файла
		if(dwBytes > 0)
			WriteFile(hNewFile, szBuffer, dwBytes, &dwBytes, NULL);
    }

	CloseHandle(hNewFile);
	SFileCloseFile(hFile);//закрываем файл
	SFileCloseArchive(hMpq);//закрываем архив
}
DWORD GetMPQFileSize(char *mpq,char *file)
{
	HANDLE hMpq=NULL;//MPQ архив
	HANDLE hFile=NULL;//MPQ файл
	DWORD size;//размер файла в байтах

	if(!SFileOpenArchive(mpq,NULL,NULL,&hMpq))//если не удалось открыть архив, выход из функции
		return 0;

	if(!SFileOpenFile(file,&hFile))//если не удалось открыть файл, выход из функции
		return 0;

	size=SFileGetFileSize(hFile,NULL);//получаем размер файла

	SFileCloseFile(hFile);//закрываем файл
	SFileCloseArchive(hMpq);//закрываем архив

	return size;
}

char *LoadFromMPQ(char *mpq,char *file)
{
	HANDLE hMpq=NULL;//MPQ архив
	HANDLE hFile=NULL;//MPQ файл
	DWORD size;//размер файла в байтах

	if(!SFileOpenArchive(mpq,NULL,NULL,&hMpq))//если не удалось открыть архив, выход из функции
		return '\0';

	if(!SFileOpenFile(file,&hFile))//если не удалось открыть файл, выход из функции
		return '\0';

	size=SFileGetFileSize(hFile,NULL);//получаем размер файла

	char *data=new char[size];

	SFileReadFile(hFile,data,size,NULL,NULL);

	SFileCloseFile(hFile);//закрываем файл
	SFileCloseArchive(hMpq);//закрываем архив

	return data;
}
----------------------------------------------------------------------------------------------
код примера можно скачать здесь или с LetItBit.

Программа для работы с архивами:
http://depositfiles.com/files/m49akl7jr
http://letitbit.net/download/00e62f4...inmpq.rar.html

Модератор: тег CODE

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распаковка архивов Starscream Общие вопросы Delphi 2 25.06.2009 23:26
MPQ архив user_jasser Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 27.02.2009 19:46
MPQ архивы D!zel Общие вопросы Delphi 9 26.01.2009 13:14
mpq архивы Хамяг Мультимедиа в Delphi 0 31.12.2008 23:25
Восстановители архивов DM_bite Софт 5 08.08.2008 11:13