На основе примеров из UnRARDLL.exe сделал несколько
и тестовую программку, выполняющую распаковку архива с помощью unrar.dll. Реализован только самый базовый функционал, тестирование и листинг архива делать не стал. Пример использования инструментов:
При использовании этих
нужно указать путь к Callback-библиотеке, она лежит рядом с
, при работе в RTE должна находиться в папке data (при желании можно поменять в RAROpenArchiveEx.vi). Если потребуется структура RAROpenArchiveDataEx, её можно вытащить из того же
. Прерывание (останов) распаковки тоже не стал делать, это на будущее, если кому-то понадобится. Это же относится и к прогрессу распаковки.
Для RARProcessFile.vi можно не задавать входы Dest Folder (папка, куда производится распаковка) и Dest FileName (full) (полный путь для извлекаемого файла: если указан, то файл извлекается по этому пути и с этим именем вместо имеющегося). В этом случае архив распаковывается туда же, где он находится. Подробное описание всех функций и структур см. в
мануале.
VI:
Исходник Callback (D7):
Код: Выделить всё
library Callback;
uses
SysUtils, Classes, Windows;
{$R *.res}
function CallbackProc(msg: UINT; UserData, P1, P2: Integer): Integer; stdcall;
var C: PChar;
begin
Result := 0;
case msg of
0: //UCM_CHANGEVOLUME
if (P2 = 0) then begin //RAR_VOL_ASK
{
Write(CR, 'Insert disk with ', PChar(P1), ' and press ''Enter'' or enter ''Q'' to exit ');
Readln(Ch);
if (UpCase (Ch) = 'Q') then
Result := -1;
}
Result := -1; //terminate operation
end;
2: //UCM_NEEDPASSWORD
begin
//Write(CR, 'Please enter the password for this archive: ');
//Readln(S);
C := PChar(UserData); //password is placed into UserData
Move(Pointer(C)^, Pointer(P1)^, StrLen(C) + 1);
//+1 to copy the zero
end;
1: //UCM_PROCESSDATA
begin
{
if (UserData <> 0) and (PINT (UserData)^ = PRINT) then begin
Flush (Output);
// Windows.WriteFile fails on big data
for I := 0 to P2 - 1 do
Write(PChar(P1 + I)^);
Flush (Output);
end;
}
end;
end;
end;
exports
CallbackProc name 'CallbackProc';
begin
end.