Автор Тема: Помогите скомпилировать прогу в Delphi  (Прочитано 3870 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн pedro

  • Emu-Land Team
  • Сообщений: 8798
  • Пол: Мужской
    • Просмотр профиля
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
OpenDialog1: TOpenDialog;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

//pac

Type
Pack_Head = Packed Record
Magic:Array[0..3] of AnsiChar;
Data_Offset:DWORD;
File_Size:DWORD;
Entries_Count:DWORD;
Encode_Flag:DWORD;
File_Name_Length:DWORD;
Reserved1:DWORD;
Reserved2:DWORD;
End;

Pack_Entries = Record //$20
File_Name:Array of Ansichar;
File_Counter:DWORD;
Start_Offset:DWORD;
Length:Dword;
Reserved:Array of DWORD;
End;

Const //Magic Const
Pak_Magic:Ansistring=’FPAC’;

procedure DBG_WRITETOFILE(Input:TmemoryStream;filename:string);
var
Tmp:Integer;
Buffer:pbyte;
pos:Int64;
begin
pos:=input.Position;
input.Position:=0;
Getmem(buffer,Input.Size);
input.Read(buffer[0],Input.Size);
tmp:=fileopen(filename+’.tmp’,fmopenwrite);
if tmp=-1 then tmp:=filecreate(filename+’.tmp’);
filewrite(tmp,buffer[0],Input.Size);
fileclose(tmp);
Freemem(buffer);
input.Position:=pos;
end;

Function SetLen(var entries:Array of Pack_Entries;const Namelength:DWORD;const Num:Integer):Boolean;
var
tmp_counter:Integer;
length:Integer;
begin
Result:=True;
length:=($14 -(Namelength mod $10)) div 4;
for tmp_counter := 0 to Num-1 do
begin
setlength(entries[tmp_counter].File_Name, Namelength);
setlength(entries[tmp_counter].Reserved,length);
end;
end;

Function ReadMyRec(Handle:Integer;var Buffer:Pack_Entries;const Namelength:DWORD):Boolean;
begin
Result:=True;
FileRead(Handle,Buffer.File_Name[0],Namelength);
FileRead(Handle,Buffer.File_Counter,4);
FileRead(Handle,Buffer.Start_Offset,4);
FileRead(Handle,Buffer.Length,4);
FileRead(Handle,Buffer.Reserved[0],($14 -(Namelength mod $10)));
end;

Function PAC_Ana_Res(str_File_Path:String):Boolean; //Res Ana
Var
hdl_File_Handle:Integer;
Head:Pack_Head;
DataBuffer:Pbyte;
Int_vnCounter,Int_hd_Size:Integer;
tmp_FileName:Ansistring;
Out_Handle:Integer;
entries:Array of Pack_Entries;
begin
Result:=True;
try
hdl_File_Handle:=fileopen(str_File_Path,fmopenread);
if hdl_File_Handle=-1 then raise Exception.Create(‘Can Not Open File’);
FileRead(hdl_File_Handle,Head.Magic[0],sizeof(Pack_Head)); //文件头
if head.Magic<>Pak_Magic then Exception.Create(‘Magic Error’);
setlength(entries,head.Entries_Count);
SetLen(entries,head.File_Name_Length,head.Entries_Count);
Int_hd_Size:=((((head.File_Name_Length + $c) div $10) * $10) + $10)*head.Entries_Count;
for Int_vnCounter := 0 to head.Entries_Count – 1 do ReadMyRec(hdl_File_Handle,entries[Int_vnCounter],head.File_Name_Length); ///////
Int_hd_Size:=Int_hd_Size+sizeof(Pack_Head);
DataBuffer:=sysgetmem(head.File_Size-Int_hd_Size);
FileRead(hdl_File_Handle,DataBuffer[0],head.File_Size-Int_hd_Size);
str_File_Path:=ExtractFilePath(str_File_Path)+’OUTPUT\’+ ChangeFileExt(extractfilename(str_File_Path),”) +’\';
FileClose(hdl_File_Handle);
setlength(tmp_FileName,head.File_Name_Length);
for Int_vnCounter := 0 to head.Entries_Count – 1 do
begin
move(entries[Int_vnCounter].File_Name[0],Pbyte(tmp_FileName)^,head.File_Name_Length);
if not DirectoryExists(ExtractFilePath(str_File_Path+tmp_FileName)) then ForceDirectories(ExtractFilePath(str_File_Path+tmp_FileName));
Out_Handle:=Filecreate(str_File_Path+tmp_FileName);
if Out_Handle=-1 then Out_Handle:=Fileopen(str_File_Path+tmp_FileName,fmopenwrite);
FileWrite(Out_Handle,DataBuffer[entries[Int_vnCounter].Start_Offset],entries[Int_vnCounter].Length);
FileClose(Out_Handle);
end;
sysfreemem(DataBuffer);
except
Result:=False;
Exit;
end;
end;

//string.atf
//其实就是艹字限用的
type
Head_Rec = Packed Record
Magic:Array[0..3] of Ansichar;
Count:DWORD;
RESERVED:DWORD;
RESERVED1:DWORD;
End;

Save_Rec = Packed Record
Offset:DWORD;
COUNT:DWORD;
SIZE:DWORD;
RESERVED:DWORD;
End;
Cont_Rec = Packed Record
Offset:DWORD;
COUNT:DWORD;
SIZE:DWORD;
RESERVED:DWORD;
End;

Str_Rec = Packed Record
Offset:DWORD;
size1:DWORD;
SIZE:DWORD;
RESERVED:DWORD;
End;

Text_Rec = Packed Record
Offset:DWORD;
Unicode_Length:DWORD;
SIZE:DWORD;
RESERVED:DWORD;
End;

File_Head = Packed Record
Header:Head_Rec;
Save:Save_Rec;
Cont:Cont_Rec;
Str:Str_Rec;
Text:Text_Rec;
End;

Func_Rec = Packed Record
Str1_Offset:DWORD;
Str1_Length:DWORD;
RESERVED:DWORD;
RESERVED1:DWORD;
Str2_Offset:DWORD;
Str2_Length:DWORD;
RESERVED2:DWORD;
RESERVED3:DWORD;
End;

Function PAC_Ana_Scr(str_File_Path:String):Boolean;
var
head:File_Head;
hdl_File_Handle:Integer;
Out_Handle:Text;
Buffer,buffer1:Pbyte;
Func:Array of Func_Rec;
i:integer;
tmpstr:Ansistring;
untmpstr:string;
begin
Result:=True;
try
hdl_File_Handle:=fileopen(str_File_Path,fmopenread);
if hdl_File_Handle=-1 then raise Exception.Create(‘Can Not Open File’);
FileRead(hdl_File_Handle,Head.Header.Magic[0],$50); //文件头
if head.Header.Magic<>‘ATF’#0 then Exception.Create(‘Magic Error’);
Setlength(Func,Head.Cont.COUNT div 2);
FileSeek(hdl_File_Handle,Head.Cont.Offset,0);
FileRead(hdl_File_Handle,Func[0].Str1_Offset,Head.Cont.SIZE);
Buffer:=sysgetmem(head.Str.size1);
Buffer1:=sysgetmem(head.Text.SIZE);
FileSeek(hdl_File_Handle,Head.Str.Offset,0);
FileRead(hdl_File_Handle,buffer[0],Head.Str.SIZE);
FileSeek(hdl_File_Handle,Head.Text.Offset,0);
FileRead(hdl_File_Handle,buffer1[0],Head.Text.SIZE);
AssignFile(Out_Handle,str_File_Path+’.TXT’);
Rewrite(Out_Handle);
Write(Out_Handle,’//FOR BCS Hatsunetakumi’#13#10);
for I := 0 to Head.Cont.COUNT div 2 -1 do
begin
setlength(tmpstr,Func[i].Str1_Length);
Move(buffer[Func[i].Str1_Offset],pbyte(tmpstr)^,Func[i].Str1_Length);
setlength(untmpstr,Func[i].Str2_Length);
Move(buffer1[Func[i].Str2_Offset*2],pbyte(untmpstr)^,Func[i].Str2_Length*2);
Write(Out_Handle,format(‘%.3d’,[i]),’ ‘,tmpstr,’ ‘,untmpstr,#13#10);
end;
close(Out_Handle);
sysfreemem(buffer);
sysfreemem(buffer1);
except
Result:=False;
Exit;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Opendialog1.Execute();
if opendialog1.FileName<>” then Edit1.Text:=opendialog1.FileName;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if PAC_Ana_Res(Edit1.Text) then MessageBox(Application.Handle,’Finished’,'DeCode’,0)
else MessageBox(Application.Handle,’Failed’,'DeCode’,0);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if PAC_Ana_Scr(Edit1.Text) then MessageBox(Application.Handle,’Finished’,'DeCode’,0)
else MessageBox(Application.Handle,’Failed’,'DeCode’,0);
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
Edit1.Text:=BrowseForFolder(’233′);
end;

function MakeFileList(Path,FileExt:string):TStringList ;
var
sch:TSearchrec;
begin
Result:=TStringlist.Create;
if rightStr(trim(Path), 1) <> ‘\’ then
Path := trim(Path) + ‘\’
else
Path := trim(Path);
if not DirectoryExists(Path) then
begin
Result.Clear;
exit;
end;
if FindFirst(Path + ‘*’, faAnyfile, sch) = 0 then
begin
repeat
Application.ProcessMessages;
if ((sch.Name = ‘.’) or (sch.Name = ‘..’)) then Continue;
if DirectoryExists(Path+sch.Name) then
begin
Result.AddStrings(MakeFileList(Path+sch.Name,FileExt));
end
else
begin
if (UpperCase(extractfileext(Path+sch.Name)) = UpperCase(FileExt)) or (FileExt=’.*’) then
Result.Add(Path+sch.Name);
end;
until FindNext(sch) <> 0;
SysUtils.FindClose(sch);
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
VAR
TMP:TSTRINGLIST;
I:INTEGER;
begin
TMP:=TSTRINGLIST.Create;
TMP:=MAKEFILELIST(EXTRACTFILEPATH(Edit1.Text),’.pac’);
for I := 0 to TMP.Count – 1 do
PAC_Ana_Res(TMP[I]);
MessageBox(Application.Handle,’Finished’,'DeCode’,0);
end;

procedure TForm1.Button5Click(Sender: TObject);
VAR
TMP:TSTRINGLIST;
I:INTEGER;
begin
TMP:=TSTRINGLIST.Create;
TMP:=MAKEFILELIST(EXTRACTFILEPATH(Edit1.Text),’.atf’);
for I := 0 to TMP.Count – 1 do
PAC_Ana_Scr(TMP[I]);
MessageBox(Application.Handle,’Finished’,'DeCode’,0);
end;

end.

это распаковщик FPAK архивов, скомуниздил код с одного из нипонских форумов а вот собрать не удалось)
Пробовал скомпилировать через delphi7, но тот жаловался на отсутствие unit3, я хз что это и где его брать.

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Re: Помогите скомпилировать прогу в Delphi
« Ответ #1 : 15 Август 2010, 02:45:52 »
Unit3 надо искать на том же форуме, наверно :)

Добавлено позже:
Код ужасный, конечно. Unit3, скорей всего не нужен, но дельфи ругается на указатели.

Добавлено позже:
Вот проект с формой из этого модуля. Процедура Button6Click не нужа, она какую-то ерунду делает.

Оффлайн pedro

  • Emu-Land Team
  • Сообщений: 8798
  • Пол: Мужской
    • Просмотр профиля
Re: Помогите скомпилировать прогу в Delphi
« Ответ #2 : 15 Август 2010, 12:02:32 »
GManiac,
Unit3 там не было, cпасибо :)

Добавлено позже:
тему можно крыть :D
« Последнее редактирование: 15 Август 2010, 12:11:55 от pedro »

Оффлайн lupus

  • Пользователь
  • Сообщений: 3828
  • Пол: Мужской
  • man with no face
    • ВКонтакте
    • Просмотр профиля
Re: Помогите скомпилировать прогу в Delphi
« Ответ #3 : 15 Август 2010, 17:10:09 »
а где используются эти FPAK

Оффлайн pedro

  • Emu-Land Team
  • Сообщений: 8798
  • Пол: Мужской
    • Просмотр профиля
Re: Помогите скомпилировать прогу в Delphi
« Ответ #4 : 15 Август 2010, 19:25:38 »
lupus,blazblue ct и cs