Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Архиваторный плагин для TC 
:(
    Опции темы
Voyager
Дата 21.10.2005, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.