|
|
|
|
|||||||
![]() |
|
|
Thread Tools | Search this Thread | Display Modes |
|
#1
|
||||
|
||||
|
ISApexEx v0.1 Beta 2 Unified Archive Extraction & Patching API for Inno Setup 7-Zip · FreeArc · RAR · Xdelta3 · HDiffPatch one DLL · Win32 · by BLACKFIRE69 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━ ▌ OVERVIEW ISApexEx is a high-performance unified library crafted for Inno Setup. It integrates five engines 7-Zip, FreeArc, RAR, Xdelta3, and HDiffPatch into a single DLL with seamless cross-format progress tracking. Mix and match .7z, .zip, .arc, .bf, .rar and xdelta3 / HDiff patch operations in one installer with continuous progress across all of them. ▌ TECHNICAL SPECIFICATIONS
Code:
╭──────────┬──────────┬──────────────────────┬─────────────────────────────╮ │ Engine │ Version │ Native DLL │ Supported Extensions │ ├──────────┼──────────┼──────────────────────┼─────────────────────────────┤ │ 7-Zip │ v26.10 │ 7z_32.dll │ .7z, .zip, .7z.001/.002... │ │ FreeArc │ v0.67 │ UnArc_32.dll │ .arc, .bf... │ │ UnRAR │ v7.22 │ UnRAR_32.dll │ .rar, .part01.rar... │ │ xdelta3 │ v0.1 │ xdelta3_wrapper.dll │ .xd3, .xdelta, .vcdiff... │ │ HDiff │ v0.1 │ hpatchz_wrapper.dll │ .hdiff... │ ╰──────────┴──────────┴──────────────────────┴─────────────────────────────╯ ▌ KEY FEATURES ✦ Unified Multi-Format Support Handle .7z, .zip, .arc, .bf, .rar and xdelta3 / HDiff patches from one DLL. Format is auto-detected from the file extension no manual engine selection. ✦ Top-Level AND Split / Multi-Volume Support Every format extracts both as a single top-level archive and as a split set: 7z split volumes (.7z.001 ), RAR multi-volume (.partNN.rar / .rNN), FreeArc disk-span volumes. Parts may even be scattered across different folders or discs. ✦ Universal File Browsing (Locate a Missing Archive or Part) When ISApexEx can't find a file it needs a top-level archive of ANY format, a 7z split part, a RAR volume, or a FreeArc spanned volume it lets the user locate it, then resumes. Built-in native browse dialog, or your own themed dialog via ISApexExSetDiskRequestCallback (one callback covers every case). ✦ Lazy DLL Loading Only the native engine DLLs actually needed are loaded at runtime. Using only .7z and .rar? UnArc_32.dll, xdelta3_wrapper.dll and hpatchz_wrapper.dll are never touched. ✦ Cross-Format Progress Overall progress (01000) spans all registered disks regardless of format. A mixed .arc + .7z + .rar + xdelta3 + .hdiff setup shows one smooth, continuous bar. ✦ Custom Extension Mapping Archives don't have to use standard extensions map any extension to any engine via ISApexExRegisterExtension before adding disks. Code:
ISApexExRegisterExtension('.bin', APEX_ARC_7Z); // .bin -> 7z engine
ISApexExRegisterExtension('.cp', APEX_ARC_ARC); // .cp -> FreeArc engine
ISApexExRegisterExtension('.dat', APEX_ARC_RAR); // .dat -> RAR engine
Real-time Overall Progress, Current Disk Progress, and Extracted/Total File Counts. ✦ Performance Metrics Accurate Current and Average Speed (MB/s). ✦ Time Management "Time Remaining" + "Elapsed Time" with three display formats (00:00:00 / x hr y min / x hours y minutes). ✦ Process Control Suspend, Resume, or Stop the extraction safely at any point. ✦ UI Stability "Calc Accuracy" reduction logic prevents erratic jumping in speed and ETA displays. ✦ Localization Switch languages at runtime via external .ini files. Ships with English and Russian. ✦ Event Callback System Optional callback fires on discrete lifecycle events engine loaded, disk started/finished/failed, error, all done. Great for logging and diagnostics. ✦ File-Based Logging Thread-safe logging with configurable verbosity (Off, Error, Info, Verbose). ✦ Thread Priority Control Set extraction thread priority before each disk (Idle Highest). ✦ Disk Space Pre-Check Verify free space on the output drive before extraction per-disk or all disks at once. ✦ Progress Persistence / Resume (Crash Recovery) On a crash (power loss, kill, BSOD) the library has saved state after each disk; on relaunch ISApexExLoadResume validates and restores progress, already-done disks are skipped. CRC32-checked, auto-deleted on success, fully opt-in (zero overhead unless ISApexExSetResumeFile is called). ▌ ENGINE FEATURES ◆ 7-Zip Normal + split archives (.7z.001 ), ZIP via the same engine, password-protected archives. The 7-Zip API requires split parts to be merged first, so ISApexEx builds a local temp file. Single directory → auto-detected; parts spread across folders → set the total with ISApexExSetSplitPartCount; override the temp location with ISApexExSetSplitTmpPath. ◆ FreeArc Normal .arc/.bf, selective folder extraction (ISApexExAddDisksEx), external processor integration (SREP, XTool, LOLZ, NZ, RZ ), config file + work path (ISApexExExtractEx), password-protected archives, and native disk-span support via cls-diskspan v2.0 when a volume is missing, the user is prompted to locate it and extraction resumes. Ship cls-diskspan.dll next to ISApexEx.dll; no ClsFunc* calls needed. ◆ RAR Normal + multi-volume archives (.part01.rar ) with automatic volume switching (no extra API calls), password-protected archives. ◆ Xdelta3 Patching
◆ HDiffPatch [NEW]
▌ SUPPORTED FILE STRUCTURES Code:
[ROOT] ├── data1.7z (normal 7z archive) ├── data2.zip (ZIP archive via 7z engine) ├── Disks/ │ ├── Disk1/ │ │ ├── Sonic 2.7z.001 (split 7z, parts across directories) │ │ └── Sonic 2.7z.002 │ └── Disk2/ │ ├── Sonic 2.7z.003 │ └── Sonic 2.7z.004 ├── data3.arc (FreeArc archive) ├── data4.bf (FreeArc archive) ├── data5.part01.rar (multi-volume RAR) ├── data5.part02.rar ├── data5.part03.rar ├── data6.rar (normal RAR archive) ├── setup-1.bin (cls-diskspan archive) ├── data7_xdelta.bin (archive containing xdelta3 patches) ├── data8_hdiff.bin (archive containing .hdiff patches) └── Setup.exe Code:
╭────────────────────────────┬──────────────────┬──────────────────╮ │ Extensions │ Engine │ Constant │ ├────────────────────────────┼──────────────────┼──────────────────┤ │ .7z .7z.001 .7z.002 ... │ 7z engine │ APEX_ARC_7Z │ │ .zip │ 7z engine │ APEX_ARC_7Z │ │ .arc .bf │ FreeArc engine │ APEX_ARC_ARC │ │ .rar .r00 .r01 ... │ RAR engine │ APEX_ARC_RAR │ │ .xd3 .xdelta .vcdiff ... │ xdelta3 engine │ APEX_ARC_XDELTA │ │ .hdiff ... │ HDiff engine │ APEX_ARC_HDIFF │ ╰────────────────────────────┴──────────────────┴──────────────────╯
▌ QUICK START EXAMPLES Example 1 Mixed Archives (7z + FreeArc + RAR) Code:
#include "ISApexEx.iss"
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
if not AddArchiveEntry('data1.7z') then Exit;
if not AddArchiveEntry('data2.bf') then Exit;
if not AddArchiveEntry('data3.rar') then Exit;
if ISApexExInitEx(2, @ProgressCallbackEx) then
begin
for i := 1 to ISApexExDiskCount do
if not ISApexExExtract(i) then Break;
ISApexExStop;
end;
end;
end;
Code:
if not AddArchiveEntry('data1.7z') then Exit; // base archive
if not AddArchiveEntry('data_xdelta.rar') then Exit; // sources + patches
// apply all *.xd3 in \patches to sources in \modified -> \rebuilt (recursive)
ISApexExAddDeltaPatchDir(
ExpandConstant('{app}\patches'),
ExpandConstant('{app}\modified'),
ExpandConstant('{app}\rebuilt'),
'*.xd3');
ISApexExDiskCount := ISApexExDiskCount + 1;
Code:
if not AddArchiveEntry('data1.7z') then Exit; // contains original game.exe
// patch game.exe in-place using game.exe.xd3
ISApexExAddDeltaPatch(
ExpandConstant('{src}\game.exe.xd3'),
ExpandConstant('{app}\game.exe'),
ExpandConstant('{app}\game.exe'));
ISApexExDiskCount := ISApexExDiskCount + 1;
Code:
if not AddArchiveEntry('Sonic 2.7z.001') then Exit;
// parts spread across folders: declare total count + a temp path
ISApexExSetSplitPartCount(ISApexExDiskCount, 7);
ISApexExSetSplitTmpPath(ISApexExDiskCount, ExpandConstant('{src}'));
Code:
if not AddArchiveEntry('data1.7z') then Exit;
// just pass the first part UnRAR switches volumes automatically
if not AddArchiveEntry('data3.part01.rar') then Exit;
Code:
ISApexExSetResumeFile(ExpandConstant('{src}\ISApexEx.resume'));
if ISApexExInitEx(2, @ProgressCallbackEx) then
begin
if ISApexExLoadResume then // prompts Yes/No to resume
Log('Resuming from previous session');
for i := 1 to ISApexExDiskCount do // done disks are skipped
if not ISApexExExtractEx(i, cfg, tmp) then Break;
ISApexExStop; // auto-deletes resume file on success
end;
One callback handles EVERY case: a missing top-level archive of any format, a 7z split part, a RAR volume, or a FreeArc spanned volume. Runs on the main thread (MsgBox / GetOpenFileName / a custom TForm are all safe). Omit it to use the built-in native browse. Code:
function MyDiskRequest(const Filename, CurrentDir: WideString): WideString;
begin
if MsgBox('Please insert / locate: ' + Filename,
mbConfirmation, MB_OKCANCEL) = mrCancel then
begin
Result := ''; // cancel -> clean user-abort
Exit;
end;
// ... GetOpenFileName, or your own themed TForm ...
Result := PickedFolder; // the folder that now holds Filename
end;
// register once, after Init, before Extract:
ISApexExSetDiskRequestCallback(@MyDiskRequest);
A full runnable version is in bin\ISApexEx_Example_HDiff.iss. Ship hpatchz_wrapper.dll next to the other engine DLLs. Code:
if not AddArchiveEntry('data1.7z') then Exit; // sources + .hdiff patches
// single file: apply game.exe.hdiff to game.exe in-place
ISApexExAddHDiffPatch(
ExpandConstant('{src}\game.exe.hdiff'),
ExpandConstant('{app}\game.exe'),
ExpandConstant('{app}\game.exe'));
ISApexExDiskCount := ISApexExDiskCount + 1;
// batch: apply all *.hdiff in \patches to \modified -> \rebuilt (recursive)
ISApexExAddHDiffPatchDir(
ExpandConstant('{app}\patches'),
ExpandConstant('{app}\modified'),
ExpandConstant('{app}\rebuilt'),
'*.hdiff');
ISApexExDiskCount := ISApexExDiskCount + 1;
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━ Feedback, bug reports, and edge cases are all welcome. . Last edited by BLACKFIRE69; Today at 04:44. Reason: Updated to Beta 02 |
| Sponsored Links |
|
#2
|
||||
|
||||
|
First of, I'd like to say. Amazing work I just have one small request or a query rather, is it possible to get 64-bit builds? Thanks.
Last edited by Razor12911; 23-06-2026 at 04:48. |
| The Following 2 Users Say Thank You to Razor12911 For This Useful Post: | ||
BLACKFIRE69 (23-06-2026), Ele (23-06-2026) | ||
|
#3
|
||||
|
||||
|
Quote:
![]() It's possible to have x64 builds, but the problem is FreeArc. Razor, do you have any tested x64 versions of unarc.dll? |
| The Following 2 Users Say Thank You to BLACKFIRE69 For This Useful Post: | ||
Behnam2018 (23-06-2026), Razor12911 (24-06-2026) | ||
|
#4
|
||||
|
||||
|
Quote:
|
| The Following 4 Users Say Thank You to Razor12911 For This Useful Post: | ||
|
#5
|
||||
|
||||
|
Quote:
Quote:
Quote:
|
| The Following 2 Users Say Thank You to BLACKFIRE69 For This Useful Post: | ||
Cesar82 (Yesterday), Razor12911 (Yesterday) | ||
|
#6
|
||||
|
||||
|
I'm well aware but the reason I would like a 64-bit build is because I want there to be tools specifically designed to work natively with Inno Setup 7 and I believe projects like this one are perfect foundation that might kick things off, of course they'll be challenges ahead but those are for the people who might be interested with this route to deal with and all I want is just availability.
|
| The Following User Says Thank You to Razor12911 For This Useful Post: | ||
Cesar82 (Yesterday) | ||
|
#7
|
||||
|
||||
|
Quote:
The lack of support for `cls-srep.dll` , `cls-lolz.dll`, etc. also leaves a huge gap. Without support for them, ISApexEx becomes more of a toy tool than a top-tier tool. Because of that, the transition to Inno Setup 7 x64 won't be particularly easy or smooth from this side, especially since many of the plugins we commonly use, such as `botva2.dll`, are still x86, and some of them haven't received updates in *years*. So, I do plan to release an x64 build of ISApexEx, but for now, I'd like to buy some time before releasing it. In the meantime, we can try compiling the entire FreeArc project as an x64 build. Hopefully, we'll also find a solid and practical way to handle the existing x86 CLS plugins whose development has already stopped, so they can still be supported in an x64 host. |
| The Following User Says Thank You to BLACKFIRE69 For This Useful Post: | ||
audiofeel (Today) | ||
|
#8
|
||||
|
||||
|
Quote:
https://github.com/Krinkelss/botva2/tree/master
__________________
https://t.me/FMXInno |
| The Following User Says Thank You to audiofeel For This Useful Post: | ||
BLACKFIRE69 (Today) | ||
|
#9
|
||||
|
||||
|
ISApexEx Update ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━ ▌ v0.1 Beta 2 (Build 6A3DC100) ✦ Added
✦ Changed BREAKING xdelta patch exports renamed (signatures unchanged): Code:
╭──────────────────────────┬──────────────────────────────╮ │ Old name (removed) │ New name │ ├──────────────────────────┼──────────────────────────────┤ │ ISApexExAddPatch │ ISApexExAddDeltaPatch │ │ ISApexExAddPatchDir │ ISApexExAddDeltaPatchDir │ ╰──────────────────────────┴──────────────────────────────╯ ✦ Changed
✦ Fixed
✦ Upgrade Notes
✦ Download
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━ |
| The Following User Says Thank You to BLACKFIRE69 For This Useful Post: | ||
audiofeel (Today) | ||
![]() |
|
|