
Опытный
 
Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005
Репутация: 2 Всего: 18
|
Написал архиваторный плагин для Total Commander. Распаковка, упаковка, удаление файлов, просмотр по ф3, редактирование по ф4 работают. Единтсвенное - по нажатию на Enter, файл не запускается, выдает сначала ошибку чтения диска, а затем что файл не найден. Может кто сталкивался с таким, как обработать нажатие на ентер? Где может быть ошибка? Урезанный код (здесь основные операции) прилагаю. | Код | unit packU;
interface
uses Windows, wcxhead;
function OpenArchive(var ArchiveData: TOpenArchiveData): THandle; stdcall; export; function ReadHeader(hArcData: THandle; var HeaderData: THeaderData): integer; stdcall; export; function ProcessFile(hArcData: THandle; Operation: integer; DestPath, DestName: PChar): integer; stdcall; export; function CloseArchive (hArcData: THandle): integer; stdcall; export; function GetPackerCaps: integer; stdcall; export;
implementation
uses SysUtils;
Const N = 32768;
type PboEntry=record Filename:string[255]; PackMethod:integer;//0x0 - not packed, 0x43707273 - packed by mission editor OriginalSize:integer;//0x0 - if file not packed or size of unpacked (origianal) file ReservedForInternalUse:integer;//must be always 0x0 DataTimeStamp:integer;//last write filetime. It is the difference, measured in seconds (not the milliseconds!), between the datetime of file modification and the standard base time known as "the epoch," 00:00:00 GMT on January 1, 1970 size:integer;//file stream size in folowing raw data. Same for packed and unpacked files dataoffset:integer; headeroffset:integer; end; Trec = array[1..N] of PboEntry;
var Counttemp:integer=0; CountEntries:integer=0; rec:^Trec; pbo:PboEntry;
Function GetHeader(hfile:Thandle;var Res:boolean):boolean; var str:string; offset,i:integer;
begin Result:=false; FileSeek(hfile,offset,0); CountEntries:=0; Repeat {чтение заголовка} inc(CountEntries); str:=''; SetString(str, nil, MAX_PATH); FileRead(hfile,str[1],MAX_PATH); i:=Pos(#0,str); SetLength(str,i-1); rec^[CountEntries].Filename:=str; FileSeek(hfile,offset+Length(str)+1,0); FileRead(hfile,rec^[CountEntries].PackMethod,4); FileRead(hfile,rec^[CountEntries].OriginalSize,4); FileRead(hfile,rec^[CountEntries].ReservedForInternalUse,4); FileRead(hfile,rec^[CountEntries].DataTimeStamp,4); FileRead(hfile,rec^[CountEntries].size,4); rec^[CountEntries].headeroffset:=offset; offset:=offset+Length(rec^[CountEntries].Filename)+21; rec^[CountEntries].dataoffset:=offset; Until rec^[CountEntries].Filename=''; CountEntries:=CountEntries-1; Result:=true; end;
function OpenArchive(var ArchiveData: TOpenArchiveData): THandle; stdcall; var Res:boolean; begin Result:=CreateFile(ArchiveData.ArcName, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0); If Result=INVALID_HANDLE_VALUE then begin Result:=E_EOPEN; exit; end; GetHeader(Result,Res); end;
function CloseArchive (hArcData: THandle): integer; stdcall; begin If hArcData=INVALID_HANDLE_VALUE then begin Result:=E_ECLOSE; exit; end; If CloseHandle(hArcData) then Result := 0 else Result:=E_ECLOSE; end;
function ReadHeader(hArcData: THandle; var HeaderData: THeaderData): integer; stdcall; begin If Counttemp<CountEntries then begin inc(Counttemp); Fillchar(HeaderData.FileName,sizeof(HeaderData.FileName),#0); Move(rec^[Counttemp].Filename[1],HeaderData.FileName,Length(rec^[Counttemp].Filename)); HeaderData.PackSize:=rec^[Counttemp].size; If rec^[Counttemp].PackMethod=0 then begin HeaderData.UnpSize:=rec^[Counttemp].size; HeaderData.FileAttr:=$00000020; //faArchive end else begin HeaderData.UnpSize:=rec^[Counttemp].OriginalSize; //HeaderData.FileAttr:=faVolumeID; end; HeaderData.FileTime:=DateTimeToFileDate(rec^[Counttemp].DataTimeStamp/86400+25569.0-tTZI.Bias/1440); pbo:=rec^[Counttemp]; Result:=0; end else begin Counttemp:=0; Result := E_END_ARCHIVE; end; end;
function ProcessFile(hArcData: THandle; Operation: integer; DestPath, DestName: PChar): integer; stdcall; begin If Operation=PK_EXTRACT then begin //messagebox(0,Pchar('DestName '+DestName+' '+DestPath),Pchar(pbo.Filename+#0),0); ExtractFile(pbo,hArcData,DestName); Counttemp:=0; end; Result := 0; end;
function GetPackerCaps: integer; stdcall; begin Result := PK_CAPS_NEW or PK_CAPS_MODIFY or PK_CAPS_MULTIPLE or PK_CAPS_DELETE or PK_CAPS_BY_CONTENT; end;
end.
| Это сообщение отредактировал(а) Voyager - 21.10.2005, 01:43
|