Функции, минимально необходимые в плагине «только для чтения»
OpenArchive – сообщает плагину, какой архив должен быть открыт для просмотра или чтения.
ReadHeader – эта функция вызывает до тех пор, пока плагин не возвратит код ошибки – плагин должен возвратить одно имя файла из архива за вызов.
ProcessFile – вызывается сразу после ReadHeader. Сообщает плагину распаковать, тестировать или пропустить этот файл.
CloseArchive – вызывается после того, как ReadHeader возвратит код ошибки.
SetChangeVolProc – устанавливает функцию для обратной связи, которая запрашивает смену диска пользователем.
SetProcessDataProc – устанавливает функцию для обратной связи, которая позволяет прервать операции упаковки или распаковки.
Если этих функций нет в библиотеке, при попытке установки плагина Total Commander выдаёт сообщение “This is not a valid packer plugin! You can find valid plugins on www.ghisler.com under section 'addons'.”
Мне нужна только упаковка, поэтому во всех функциях по открытию/распаковке архива (OpenArchive, ReadHeader, ProcessFile, CloseArchive) я возвращаю код ошибки E_NOT_SUPPORTED (функция не поддерживается).
function OpenArchive(var ArchiveData: TOpenArchiveData): THandle; stdcall;
begin
Result:= E_NOT_SUPPORTED; // функция не поддерживается
end;
Функция GetPackerCaps сообщает Total Commander'у, какие возможности поддерживает плагин. Пока мне нужны только PK_CAPS_NEW (может создавать новые архивы) и PK_CAPS_HIDE (скрыть иконку архива, показать как обычный файл). Также выявлено, что при отсутствии флага PK_CAPS_MULTIPLE Total Commander всегда ставит галочку «Отдельные архивы для каждого выбранного файла/каталога». Даже если плагин не создаёт мультифайловые архивы (например, только конвертирует файлы), флаг лучше добавить. Добавьте также флаг PK_CAPS_MODIFY, без него Тотал будет ругаться, если имя архива будет таким же, как имя существующего файла.
// определение возможностей плагина
function GetPackerCaps: integer; stdcall;
begin
Result:= PK_CAPS_NEW or // Может создавать новые архивы
PK_CAPS_HIDE or // Скрыть иконку архива
PK_CAPS_MULTIPLE or // Архив может содержать несколько файлов
PK_CAPS_MODIFY; // Может изменять существующие архивы
end;