-- ~~~ Структура ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ local tEXTRACTINGINFO = MemoryEx.DefineStruct{ INT("dwFileSize"); INT("dwWriteSize"); STRING("szSourceFileName", 1, 513, MEMEX_ASCII); STRING("dummy1", 1, 3, MEMEX_ASCII); STRING("szDestFileName", 1, 513, MEMEX_ASCII); STRING("dummy", 1, 3, MEMEX_ASCII); }; -- ~~~ Загрузка модуля ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ require 'alien'; -- ~~~ Типы ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ local SevenZip = alien.load('7-zip32.dll'); SevenZip.SevenZipSetOwnerWindowEx:types{"int", "callback", abi="stdcall"}; SevenZip.SevenZip:types{"int", "string", "pointer", "int", abi="stdcall"}; -- ~~~ Объявление callback-функции ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function ARCHIVERPROC (hWnd, uMsg, nState, lpExInfo) if (nState == 0) then local EXTRACTINGINFO = MemoryEx.AssignStruct(lpExInfo, tEXTRACTINGINFO); local nFileSize = EXTRACTINGINFO.dwFileSize; local nWriteSize = EXTRACTINGINFO.dwWriteSize; Progress.SetCurrentPos("Progress1", nWriteSize / nFileSize * 100); elseif (nState == 2) then Progress.SetCurrentPos("Progress1", 100); end return 1; end local callback_func = alien.callback(ARCHIVERPROC, {"int", "uint", "uint", "int", abi="stdcall"}); SevenZip.SevenZipSetOwnerWindowEx(Application.GetWndHandle(), callback_func); -- ~~~~ Пример распаковки ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ local sArcPath = "C:\\m.7z"; -- путь к архиву local pOutBuffer = alien.buffer(32768); -- Извлечение архива на диск D: -- См. остальные команды распаковки SevenZip.SevenZip(Application.GetWndHandle(), "x \""..sArcPath.."\" -o\"D:\\\" -hide", pOutBuffer, 32768); |