Visual Basic 3 / 16-bit NE · VBRUN300 · 1993

VB3 decompiler: a 16-bit EXE back to a project in VB3's own format.

Visual Basic 3 programs still run payroll, lab equipment and point-of-sale systems thirty years on. Their EXEs keep the whole project inside Windows 3.1 resources, and our VB3 decompiler reads it back into exactly what a VB3 developer would expect: a text .MAK, text .FRM files with their .FRX resources, .BAS modules, VBX properties by name, real event-handler names and structured Basic.

See a real VB3 recovery, VisData, next to its original source →

// under the hood

Where a VB3 EXE keeps its project

A VB2 or VB3 executable is a 16-bit NE image whose project lives entirely in RCDATA resources. Resource 1 is the project object table — one record per form, per VBX file and per control class. Resource 2 holds global data, constants, Type descriptors and the chain of code modules. Then, for each form, an even-numbered resource carries the binary form designer and the odd-numbered one its control-name pool. The designer blocks are byte-compatible with a loose binary .FRM file, so one parser serves both.

Code is P-Code for the VBRUN300 interpreter. The decompiler recognises each statement boundary the same way the runtime does — by the token whose handler advances the per-statement counter — and property ids are read from the binary rather than hard-coded, because VB3 assigns them per project: id 14 is DragIcon in one program, Tag in another and Width in a third.

// what comes back

What the VB3 decompiler brings back

  • ✓

    A VB3-format project

    Text .MAK, one text .FRM per form plus .FRX, and MODULEn.BAS files — the format VB3 itself reads, and the starting point for VB4's upgrade path if you want to move forward.

  • ✓

    Every control, including VBX custom controls

    The full control tree with nesting. VBX properties are decoded by name from the shipped .300 descriptors — per-class property lists plus 43 standard properties — so third-party controls are not left as blobs.

  • ✓

    Real event-handler names and signatures

    717 of 717 handler names correct across the benchmark corpus, none invented, with parameter lists, Sub-versus-Function and return types exact on all 915 procedures.

  • ✓

    Structured source

    If / ElseIf / Else, Select Case (jump-table and linear forms), Do / Loop, While / Wend, For / Next, line labels, GoSub / Return, On Error, the graphics statements (Line, Circle, PSet, Scale, Point), typed Dim / Global / Const blocks and real Win16 Declare signatures.

// measured

Measured on 22 source-paired programs

MetricResult
Control property values vs original source (1,180 controls, 22 Microsoft samples)7,514 of 7,522 — 99.9%
Procedures, parameters, Sub/Function kind, return types973 of 973 · 915 of 915
Event-handler names717 of 717, none invented
String literals reproduced verbatim1,073 of 1,073
Statements emitted5,034 of 5,133 — 98.1%
Lines matching the source exactly2,982 of 3,053 — 97.7%; all 71 misses are bracketing or a coercion the P-Code does not keep
Win16 Declare signatures56 of 58 (the two are ODBC)

See the VisData recovery →

// the fine print

What a VB3 EXE does not keep

Module and procedure names are not in the file

VB3 stores event-handler names but not the names of general procedures, modules, locals, globals or type members. They come back as stable invented names — MODULE1.BAS, sub1A3C, gv0040 — that you rename as you read. Comments are gone. A VBX whose .300 descriptor we do not have cannot have its properties named, so send the VBX along. Any statement the engine cannot decode is marked ' . . . not decoded, never guessed. DoDi's classic VB3 decompiler ships alongside ours for a second opinion.

// how to decompile your program

Three ways to get from the EXE to source

STEP 01

Confirm the format

Run the free VBScanner on the folder. It reads the file headers and tells you what built each EXE, DLL or OCX and whether it is P-Code, native or IL.

STEP 03

…or let us do it

Request a free evaluation. We examine the binary, tell you exactly what comes back, and quote a fixed price and timeline. Hand-finishing of anything the engine marks is included.

// questions

VB3 decompiler questions

Can I open the decompiled VB3 project in a modern Visual Basic?

The output is in VB3's own format, so VB3 opens it directly. VB4 can load and upgrade a VB3 project, and VB5/VB6 open VB4 projects, which is the usual path to a 32-bit build.

My program uses third-party VBX controls. Will they come back?

Yes, as long as the VBX is available: properties are decoded from the control's descriptor and named. Include the VBX files with your evaluation.

How much of the code is actually recovered?

On Microsoft's own sample programs, 98% of statements are emitted and 97.7% of lines match the original exactly; the rest are marked in the output rather than filled in.

// other formats

Every generation of Basic has its own page

Ready to decompile your VB3 program?

The evaluation is free and tells you exactly what your binary yields before you spend anything. Or license the decompiler and run it in-house today.

free evaluation fixed quotes NDA available software from $299