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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2010, 16:42   #1
rangel
Пользователь
 
Регистрация: 31.10.2007
Сообщений: 65
По умолчанию Использование функций SFmpq.dll

вот модуль (писал практически сам) который работает с дллкой
Код:
unit SFmpqapi;

{$WARNINGS OFF}

interface

uses
Classes, SysUtils, Windows, Dialogs;

const
SFmpq = 'SFmpq.dll';

type
TSFmpqapi = class
private
    FMPQHandle: cardinal;
protected

public
    constructor Create;
    function LoadFromFile(AFileName: string): boolean;
    function CloseMPQFile: boolean;
    function AddFileToArchive(AFileName,ADestFileName:string):boolean;
    function DelFile(AFileName:string):boolean;
end;


function MpqOpenArchiveForUpdate(lpFileName: PChar; dwFlags: longint; dwMaximumFilesInArchive: longint):longword; stdcall;
function MpqAddFileToArchive(var hMPQ: longword; lpSourceFileName, lpDestFileName: PChar; dwFlags: longint): longbool; stdcall;
function MpqCloseUpdatedArchive(var hMPQ:longword; dwUnknown2:longint):boolean; stdcall;
function MpqDeleteFile(var hMPQ:longword; lpFileName: PChar):boolean; stdcall;

implementation

function MpqAddFileToArchive; external SFmpq;
function MpqOpenArchiveForUpdate; external SFmpq;
function MpqCloseUpdatedArchive; external SFmpq;
function MpqDeleteFile; external SFmpq;

{ TSFmpqapi }

function TSFmpqapi.LoadFromFile(AFileName: string): boolean;
begin
FMPQHandle := MpqOpenArchiveForUpdate(PChar(AFileName), $4, 50);
showmessage(inttohex(FMPQHandle,0));
if FMPQHandle>0 then
result:=true
else result:=false;
end;

function TSFmpqapi.CloseMPQFile: boolean;
begin
Result := MpqCloseUpdatedArchive(FMPQHandle,0);
showmessage(inttohex(FMPQHandle,0));
end;

function TSFmpqapi.addFileToArchive(AFileName,ADestFileName:string): boolean;
begin
Result := MpqAddFileToArchive(FMPQHandle,Pchar(AFileName),Pchar(ADestFileName),1);
end;

constructor TSFmpqapi.Create;
begin
FMPQHandle := 0;
end;


function TSFmpqapi.DelFile(AFileName: string): boolean;
begin
Result := MpqDeleteFile(FMPQHandle,PChar(AFileName));
end;



end.
вот я использую его

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SFmpqapi;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  St2:TSFmpqapi;
implementation

{$R *.dfm}

procedure TForm1.Button3Click(Sender: TObject);
begin
St2:=TSFmpqapi.Create;
St2.LoadFromFile('d3scenism vtest.w3x');
St2.DelFile('war3map.j');
st2.AddFileToArchive('lol.rar','');
St2.CloseMPQFile;
end;

end.
единственное что работает из этого это LoadFromFile
загружает нормально, но не может удалить не добавить файл в этот архив
прошу помоч мне разобраться
1. добавить файл
2. удалить файл
3. перезаписать файл
4. дописать файл в поддерикторию
5. создать директорию
...

Последний раз редактировалось rangel; 16.02.2010 в 16:55.
rangel вне форума Ответить с цитированием
Старый 16.02.2010, 16:43   #2
rangel
Пользователь
 
Регистрация: 31.10.2007
Сообщений: 65
По умолчанию

вот кусок исходного кода этой дллки
Код:
[helpstring("MpqOpenArchiveForUpdate flags")]
	typedef enum {
		MOAU_CREATE_NEW =       0x00,
		MOAU_CREATE_ALWAYS =    0x08,
		MOAU_OPEN_EXISTING =    0x04,
		MOAU_OPEN_ALWAYS =      0x20,
		MOAU_READ_ONLY =        0x10,
		MOAU_MAINTAIN_ATTRIBUTES=0x02,
		MOAU_MAINTAIN_LISTFILE =0x01,
	} MpqOpenArchiveForUpdate_Flags;

	[helpstring("MpqAddFileToArchive flags")]
	typedef enum {
		MAFA_EXISTS =          0x80000000,
		MAFA_UNKNOWN40000000 = 0x40000000,
		MAFA_MODCRYPTKEY =     0x00020000,
		MAFA_ENCRYPT =         0x00010000,
		MAFA_COMPRESS =        0x00000200,
		MAFA_COMPRESS2 =       0x00000100,
		MAFA_REPLACE_EXISTING =0x00000001,
	} MpqAddFileToArchive_Flags;

	[helpstring("MpqAddFileToArchiveEx compression flags")]
	typedef enum {
		MAFA_COMPRESS_STANDARD = 0x08,
		MAFA_COMPRESS_DEFLATE  = 0x02,
		MAFA_COMPRESS_WAVE     = 0x81,
		MAFA_COMPRESS_WAVE2    = 0x41,
		MAFA_COMPRESS_WAVECOMP1 = 0x80,
		MAFA_COMPRESS_WAVECOMP2 = 0x40,
		MAFA_COMPRESS_WAVECOMP3 = 0x01,
	} MpqAddFileToArchiveEx_Compression_Types;

[helpstring("MPQ archive creation and editing functions")]
	module MPQ
	{
		[entry("MpqOpenArchiveForUpdate"),helpstring("")]
			MPQHANDLE WINAPI MpqOpenArchiveForUpdate(LPCSTR lpFileName, DWORD dwFlags, DWORD dwMaximumFilesInArchive);
		[entry("MpqCloseUpdatedArchive"),helpstring("")]
			DWORD     WINAPI MpqCloseUpdatedArchive(MPQHANDLE hMPQ, DWORD dwUnknown2);
		[entry("MpqAddFileToArchive"),helpstring("")]
			BOOL      WINAPI MpqAddFileToArchive(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags);
		[entry("MpqAddWaveToArchive"),helpstring("")]
			BOOL      WINAPI MpqAddWaveToArchive(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags, DWORD dwQuality);
		[entry("MpqRenameFile"),helpstring("")]
			BOOL      WINAPI MpqRenameFile(MPQHANDLE hMPQ, LPCSTR lpcOldFileName, LPCSTR lpcNewFileName);
		[entry("MpqDeleteFile"),helpstring("")]
			BOOL      WINAPI MpqDeleteFile(MPQHANDLE hMPQ, LPCSTR lpFileName);
		[entry("MpqCompactArchive"),helpstring("")]
			BOOL      WINAPI MpqCompactArchive(MPQHANDLE hMPQ);
		[entry("MpqAddFileToArchiveEx"),helpstring("")]
			BOOL      WINAPI MpqAddFileToArchiveEx(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags, DWORD dwCompressionType, DWORD dwCompressLevel);
		[entry("MpqAddFileFromBufferEx"),helpstring("")]
			BOOL      WINAPI MpqAddFileFromBufferEx(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags, DWORD dwCompressionType, DWORD dwCompressLevel);
		[entry("MpqAddFileFromBufferEx"),helpstring("")]
			BOOL      WINAPI MpqAddFileFromBufferExB(MPQHANDLE hMPQ, byte *lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags, DWORD dwCompressionType, DWORD dwCompressLevel);
		[entry("MpqAddFileFromBuffer"),helpstring("")]
			BOOL      WINAPI MpqAddFileFromBuffer(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags);
		[entry("MpqAddFileFromBuffer"),helpstring("")]
			BOOL      WINAPI MpqAddFileFromBufferB(MPQHANDLE hMPQ, byte *lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags);
		[entry("MpqAddWaveFromBuffer"),helpstring("")]
			BOOL      WINAPI MpqAddWaveFromBuffer(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags, DWORD dwQuality);
		[entry("MpqAddWaveFromBuffer"),helpstring("")]
			BOOL      WINAPI MpqAddWaveFromBufferB(MPQHANDLE hMPQ, byte *lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags, DWORD dwQuality);
		[entry("MpqRenameAndSetFileLocale"),helpstring("")]
			BOOL      WINAPI MpqRenameAndSetFileLocale(MPQHANDLE hMPQ, LPCSTR lpcOldFileName, LPCSTR lpcNewFileName, LCID nOldLocale, LCID nNewLocale);
		[entry("MpqDeleteFileWithLocale"),helpstring("")]
			BOOL      WINAPI MpqDeleteFileWithLocale(MPQHANDLE hMPQ, LPCSTR lpFileName, LCID nLocale);
		[entry("MpqSetFileLocale"),helpstring("")]
			BOOL      WINAPI MpqSetFileLocale(MPQHANDLE hMPQ, LPCSTR lpFileName, LCID nOldLocale, LCID nNewLocale);
	};
rangel вне форума Ответить с цитированием
Старый 16.02.2010, 16:50   #3
rangel
Пользователь
 
Регистрация: 31.10.2007
Сообщений: 65
По умолчанию

Ниже сорцы и пару вещей для теста
source WinMPQexe.rar
это сорцы программы (не на делфи) которая нормально работает с dll
source SFmpqdll.rar
это сорцы dll ки
SFmpqdll.rar
сама дллка
map for test.rar
карта, файл на котором тестировать работоспособность программы
War3MPQ.rar
всё вместе (мой проект, либы модули сорцы и тп)
Вложения
Тип файла: rar source SFmpqdll.rar (57.9 Кб, 25 просмотров)
Тип файла: rar source WinMPQexe.rar (73.4 Кб, 24 просмотров)
Тип файла: rar SFmpqdll.rar (68.0 Кб, 19 просмотров)
Тип файла: rar map for test.rar (233.3 Кб, 17 просмотров)
Тип файла: rar War3MPQ.rar (3.98 Мб, 26 просмотров)

Последний раз редактировалось rangel; 16.02.2010 в 16:53.
rangel вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36
использование функций в качестве параметров других функций mono Помощь студентам 0 20.04.2009 18:25
Использование функций prikolist Общие вопросы C/C++ 15 06.04.2009 18:42
Использование логических функций Клубничка Microsoft Office Excel 52 15.01.2009 15:01