VERSION DVX 1.00 ' resedit.frm -- DVX Resource Editor ' ' Graphical editor for the resource blocks appended to DXE3 ' files (.app, .wgt, .lib). View, add, remove, and extract ' resources of type icon, text, or binary. ' ' Add commdlg.bas and resource.bas to your project, then click Run. Begin Form ResEdit Caption = "DVX Resource Editor" Layout = VBox AutoSize = False Resizable = True Centered = True Width = 500 Height = 340 Begin Menu mnuFile Caption = "&File" Begin Menu mnuOpen Caption = "&Open..." End Begin Menu mnuClose Caption = "&Close" Enabled = False End Begin Menu mnuSep1 Caption = "-" End Begin Menu mnuExit Caption = "E&xit" End End Begin Menu mnuResource Caption = "&Resource" Begin Menu mnuAddText Caption = "Add &Text..." Enabled = False End Begin Menu mnuAddFile Caption = "Add &File..." Enabled = False End Begin Menu mnuEditText Caption = "&Edit Text..." Enabled = False End Begin Menu mnuSep2 Caption = "-" End Begin Menu mnuExtract Caption = "E&xtract..." Enabled = False End Begin Menu mnuRemove Caption = "&Remove" Enabled = False End End Begin ListView ResList Weight = 1 End Begin Label LblStatus Caption = "No file loaded." Weight = 0 End End ' The MIT License (MIT) ' ' Copyright (C) 2026 Scott Duensing ' ' Permission is hereby granted, free of charge, to any person obtaining a copy ' of this software and associated documentation files (the "Software"), to ' deal in the Software without restriction, including without limitation the ' rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ' sell copies of the Software, and to permit persons to whom the Software is ' furnished to do so, subject to the following conditions: ' ' The above copyright notice and this permission notice shall be included in ' all copies or substantial portions of the Software. ' ' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ' IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ' FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ' AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ' LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ' FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS ' IN THE SOFTWARE. OPTION EXPLICIT DIM filePath AS STRING DIM resHandle AS LONG filePath = "" resHandle = 0 Load ResEdit ResEdit.Show ResList.SetColumns "Name,20|Type,8|Size,12" LblStatus.Caption = "Ready. Use File > Open to load a DXE file." ' ============================================================ ' Type name helper ' ============================================================ FUNCTION TypeName$(t AS LONG) IF t = RES_TYPE_ICON THEN TypeName$ = "Icon" ELSEIF t = RES_TYPE_TEXT THEN TypeName$ = "Text" ELSEIF t = RES_TYPE_BINARY THEN TypeName$ = "Binary" ELSE TypeName$ = "Unknown" END IF END FUNCTION ' ============================================================ ' Format a byte size for display ' ============================================================ FUNCTION FormatSize$(sz AS LONG) IF sz < 1024 THEN FormatSize$ = STR$(sz) + " B" ELSE FormatSize$ = STR$(sz \ 1024) + " KB" END IF END FUNCTION ' ============================================================ ' Refresh the resource list from the open handle ' ============================================================ SUB RefreshList ResList.Clear IF resHandle = 0 THEN EXIT SUB END IF DIM n AS LONG n = ResCount(resHandle) DIM ix AS LONG FOR ix = 0 TO n - 1 ResList.AddItem ResName$(resHandle, ix) ResList.SetCell ix, 1, TypeName$(ResType(resHandle, ix)) ResList.SetCell ix, 2, FormatSize$(ResSize(resHandle, ix)) NEXT ix LblStatus.Caption = filePath + " - " + STR$(n) + " resource(s)" END SUB ' ============================================================ ' Close the current file ' ============================================================ SUB CloseFile IF resHandle <> 0 THEN ResClose resHandle resHandle = 0 END IF filePath = "" ResList.Clear ResEdit.Caption = "DVX Resource Editor" mnuClose.Enabled = False mnuAddText.Enabled = False mnuAddFile.Enabled = False mnuEditText.Enabled = False mnuExtract.Enabled = False mnuRemove.Enabled = False LblStatus.Caption = "No file loaded." END SUB ' ============================================================ ' Reopen the file (after modification) and refresh ' ============================================================ SUB ReopenAndRefresh DIM path AS STRING path = filePath IF resHandle <> 0 THEN ResClose resHandle resHandle = 0 END IF resHandle = ResOpen(path) IF resHandle = 0 THEN ' File may have had all resources stripped filePath = path ResList.Clear LblStatus.Caption = path + " - 0 resource(s)" ELSE filePath = path RefreshList END IF END SUB ' ============================================================ ' Enable/disable selection-dependent menus ' ============================================================ SUB UpdateMenuState DIM hasSel AS INTEGER hasSel = (ResList.ListIndex >= 0) mnuExtract.Enabled = hasSel mnuRemove.Enabled = hasSel mnuEditText.Enabled = hasSel END SUB ' ============================================================ ' Menu handlers ' ============================================================ SUB mnuOpen_Click DIM path AS STRING path = basFileOpen("Open DXE File", "Applications (*.app)|Widget Modules (*.wgt)|Libraries (*.lib)|All Files (*.*)") IF path = "" THEN EXIT SUB END IF CloseFile filePath = path ResEdit.Caption = path + " - DVX Resource Editor" mnuClose.Enabled = True mnuAddText.Enabled = True mnuAddFile.Enabled = True resHandle = ResOpen(path) IF resHandle = 0 THEN LblStatus.Caption = "No resources in " + path EXIT SUB END IF RefreshList END SUB SUB mnuClose_Click CloseFile END SUB SUB mnuExit_Click Unload ResEdit END SUB SUB mnuAddText_Click IF filePath = "" THEN EXIT SUB END IF DIM rName AS STRING rName = basInputBox2("Add Text Resource", "Resource name:", "") IF rName = "" THEN EXIT SUB END IF DIM text AS STRING text = basInputBox2("Add Text Resource", "Text value:", "") IF ResAddText(filePath, rName, text) THEN ReopenAndRefresh LblStatus.Caption = "Added text resource: " + rName ELSE LblStatus.Caption = "Failed to add resource." END IF END SUB SUB mnuAddFile_Click IF filePath = "" THEN EXIT SUB END IF DIM rName AS STRING rName = basInputBox2("Add File Resource", "Resource name:", "") IF rName = "" THEN EXIT SUB END IF DIM typeChoice AS LONG typeChoice = basChoiceDialog("Resource Type", "Select resource type:", "Icon|Binary", 0) IF typeChoice < 0 THEN EXIT SUB END IF DIM typeVal AS LONG IF typeChoice = 0 THEN typeVal = RES_TYPE_ICON ELSE typeVal = RES_TYPE_BINARY END IF DIM srcPath AS STRING srcPath = basFileOpen("Select Source File", "All Files (*.*)") IF srcPath = "" THEN EXIT SUB END IF IF ResAddFile(filePath, rName, typeVal, srcPath) THEN ReopenAndRefresh LblStatus.Caption = "Added resource: " + rName ELSE LblStatus.Caption = "Failed to add resource." END IF END SUB SUB mnuEditText_Click IF filePath = "" THEN EXIT SUB END IF DIM sel AS LONG sel = ResList.ListIndex IF sel < 0 THEN EXIT SUB END IF DIM rName AS STRING rName = ResName$(resHandle, sel) DIM t AS LONG t = ResType(resHandle, sel) IF t <> RES_TYPE_TEXT THEN LblStatus.Caption = "Only text resources can be edited inline." EXIT SUB END IF DIM oldText AS STRING oldText = ResGetText$(filePath, rName) DIM newText AS STRING newText = basInputBox2("Edit Text Resource", "Value for '" + rName + "':", oldText) IF ResAddText(filePath, rName, newText) THEN ReopenAndRefresh LblStatus.Caption = "Updated: " + rName ELSE LblStatus.Caption = "Failed to update resource." END IF END SUB SUB mnuExtract_Click IF filePath = "" OR resHandle = 0 THEN EXIT SUB END IF DIM sel AS LONG sel = ResList.ListIndex IF sel < 0 THEN EXIT SUB END IF DIM rName AS STRING rName = ResName$(resHandle, sel) DIM outPath AS STRING outPath = basFileSave("Extract Resource", "All Files (*.*)") IF outPath = "" THEN EXIT SUB END IF IF ResExtract(filePath, rName, outPath) THEN LblStatus.Caption = "Extracted '" + rName + "' to " + outPath ELSE LblStatus.Caption = "Failed to extract resource." END IF END SUB SUB mnuRemove_Click IF filePath = "" THEN EXIT SUB END IF DIM sel AS LONG sel = ResList.ListIndex IF sel < 0 THEN EXIT SUB END IF DIM rName AS STRING rName = ResName$(resHandle, sel) DIM ans AS INTEGER ans = MsgBox("Remove resource '" + rName + "'?", vbYesNo) IF ans = vbNo THEN EXIT SUB END IF ' Close handle before modifying ResClose resHandle resHandle = 0 IF ResRemove(filePath, rName) THEN ReopenAndRefresh LblStatus.Caption = "Removed: " + rName ELSE ReopenAndRefresh LblStatus.Caption = "Failed to remove resource." END IF END SUB ' ============================================================ ' ListView selection change ' ============================================================ SUB ResList_Click UpdateMenuState END SUB SUB ResList_DblClick IF filePath = "" OR resHandle = 0 THEN EXIT SUB END IF DIM sel AS LONG sel = ResList.ListIndex IF sel < 0 THEN EXIT SUB END IF DIM t AS LONG t = ResType(resHandle, sel) IF t = RES_TYPE_TEXT THEN mnuEditText_Click ELSE mnuExtract_Click END IF END SUB