twinBASIC Update: August 5, 2025

Highlights include the upcoming release of 64-bit XYplorer (a major commercial project converted from VB6 to tB), a VRAM display utility, and WMI COM sample code.

twinBASIC Update: August 5, 2025

On April 23, 2021, I helped Wayne Phillips introduce the world to twinBASIC at the Access DevCon Vienna conference. I boldly predicted that twinBASIC (along with the Monaco editor) would replace VBA and its outdated development environment by 2025. With that goal in mind, this weekly update is my attempt to keep the project fresh in the minds of the VBA development community.

Every Sunday Monday week, I will be providing updates on the status of the project, linking to new articles discussing twinBASIC, and generally trying to increase engagement with the project. If you come across items that should be included here, please leave a comment below.

Here are some links to get involved with the project:


[Editor's Note: Sorry for missing last week's update. I was on a family vacation. The highlights and changelog below are for the past two weeks.]

Highlights

* Generated via Gemini-2.5-Pro.

XYplorer's 64-bit Release: A twinBASIC Milestone

The twinBASIC community celebrates a landmark achievement as a major commercial application built with the language prepares for its official launch.

The popular and long-standing file manager, XYplorer, has officially announced the upcoming release of its new 64-bit version, completely rebuilt using twinBASIC. This significant milestone was shared in the general channel, pointing to the official announcement and a 20% introductory discount on the XYplorer website. The news was met with considerable excitement from the community, underscoring the real-world impact of the project. This successful, high-profile port demonstrates twinBASIC's readiness for large-scale, professional software development.

This release serves as powerful proof of twinBASIC's capability to modernize and empower complex, real-world VB6 codebases for the 64-bit era.

Discord Chat Summary

* Auto-generated via Gemini-2.5-Pro

Overview

The past two weeks have seen a vibrant mix of deep technical discussions, significant community achievements, and diligent bug reporting. Key conversations revolved around the future of Windows integration with a detailed look at WinRT and winmd metadata parsing. The community celebrated a major project milestone with the official release of a 64-bit application built with twinBASIC, while also actively identifying and reporting bugs in recent builds, particularly concerning the Val() function and Report Forms.

Bug Fixes & Known Issues

  • A bug was identified and reported where the Val() function fails with a Type Mismatch error for specific strings containing a percentage sign, such as Val("10%").
  • Community members discovered that Report Forms are non-functional in recent builds post-v833, prompting users who rely on this feature to temporarily use older versions.
  • Waynephillipsea confirmed that setting a control's .Container property at runtime is not yet supported but is a known issue that will be resolved.
  • A user reported that using the END statement in a compiled executable sometimes fails to terminate the process, leaving it running in the background, though others could not immediately reproduce this.

IDE & Development Experience

  • The IDE's "Go To Definition" feature (F12) and the detailed UDT information available on hover—which includes member offsets and padding—received high praise from the community.
  • A feature request was made to make function names in the hover-info pop-up clickable, allowing for quick navigation similar to Visual Studio 2022.
  • It was noted that the Line control currently lacks Anchor properties, leading to a discussion on workarounds using the Form_Resize or Form_Paint events for manual resizing, a common practice in classic VB6.

Community Contributions & Projects

  • A major milestone was announced: the official release of the 64-bit version of the popular file manager XYplorer, which was rebuilt using twinBASIC.
  • Fafalone improved the main twinBASIC GitHub repository's presentation by adding a social media preview image and topic tags to enhance its visibility and searchability on the platform.
  • A typo in the WNetDisconnectDialog API declaration within WinDevLib was reported and promptly acknowledged by fafalone.

WinRT and Modern Windows Integration

  • A significant technical discussion was initiated by bclothier regarding the possibility of twinBASIC becoming a first-class consumer of WinRT by implementing a winmd metadata file parser.
  • Vangoghgaming and wqweto elaborated on this, discussing the similarities between winmd and classic Type Libraries (.tlb) and the potential for generating twinBASIC-compatible interfaces and classes directly, which would open the door to modern controls like WinUI 3.
  • The conversation touched upon the underlying COM-based nature of the metadata APIs (IMetaDataDispenser) and the effort required to create a language projection that would make WinRT usage feel idiomatic in twinBASIC.

Language & API Design

  • Mansellan sparked a conversation about naming conventions for new libraries, weighing the pros and cons of following classic VBx style (e.g., Exists) versus modern .NET style (e.g., ContainsKey).
  • The use of Implements Via was discussed as a powerful tool for composition and an alternative to full inheritance, though it was noted that it doesn't directly support overrides.
  • Waynephillipsea clarified that for For...Each loops, only the IEnumVARIANT interface is supported for enumeration at this time.

Graphics and UI Theming

  • There was active interest in using uxtheme.dll for creating modern, themed user interfaces, with members sharing resources like the VBAccelerator Theme Explorer project.
  • Fafalone discovered a comprehensive OpenGL library for VBA with x64 support, suggesting it could be ported to twinBASIC to provide high-level wrappers for OpenGL.
  • In a related discussion, fafalone clarified that WinDevLib already provides extensive low-level declares for a wide range of graphics APIs, including GDI+, Direct3D (9-12), Direct2D, and DirectWrite, which serve as a foundation for building higher-level abstractions.

Conclusion

This period highlights a community that is not only building real-world applications with twinBASIC but also actively shaping its future through in-depth architectural discussions and rigorous testing. The successful launch of the 64-bit XYplorer demonstrates the platform's readiness for complex commercial projects. Meanwhile, forward-looking conversations about WinRT integration and ongoing bug reports ensure the project continues to advance in both stability and capability.

Around the Web

Get Total Video RAM Utility

From fafalone in show-and-tell:

Most methods for this can't work above 4GB because they use 4 byte variables in 32bit or even 64bit, and most workarounds have major flaws. i made a small demo of a method i found in one of Pavel Yosifovich's programs to get it through d3d kernel mode thunking APIs (don't worry they're gdi32.dll APIs, this isn't a driver).
GitHub - fafalone/GetVideoMemory: A small utility to display total video RAM
A small utility to display total video RAM. Contribute to fafalone/GetVideoMemory development by creating an account on GitHub.

Using WMI COM Interfaces

Some quick sample code from fafalone in the show-and-tell channel:

Ever thought about using the lower level COM interfaces for WMI rather than the VBScript-targeted scripting WMI library? The newest WinDevLib version defines the client interfaces for the C/C++ COM WMI architecture. Here's an example for processor speed:
Private Function GetClockSpeedWMI() As LongLong
        On Error Resume Next 'manual error handling
        Dim retSpeed As LongLong = 64
        Dim spLoc As IWbemLocator
        Dim hr As Long = CoCreateInstance(CLSID_WbemLocator, Nothing, CLSCTX_SERVER, IID_IWbemLocator, spLoc)
        If (hr <> S_OK) Or (spLoc Is Nothing) Then
            Return retSpeed
        End If
        
        Dim bstrNamespace As String = "\\.\root\CIMV2"
        Dim spServices As IWbemServices
        
        spLoc.ConnectServer(bstrNamespace, vbNullString, vbNullString, vbNullString, 0, vbNullString, Nothing, spServices)
        If Err.LastHresult <> WBEM_S_NO_ERROR Then
            Return retSpeed
        End If
        
        'Switch the security level to IMPERSONATE so that provider will grant access to system-level objects.  
        hr = CoSetProxyBlanket(spServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, 0, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, 0, EOAC_NONE)
        If (hr <> S_OK) Then
            Return retSpeed
        End If
        
        Dim spEnumInst As IEnumWbemClassObject
        spServices.CreateInstanceEnum("Win32_Processor", WBEM_FLAG_SHALLOW, Nothing, spEnumInst)
        If (Err.LastHresult <> WBEM_S_NO_ERROR) Or (spEnumInst Is Nothing) Then
            Return retSpeed
        End If
        
        Dim uNumOfInstances As Long = 0
        Dim spInstance As IWbemClassObject
        spEnumInst.Next(10000, 1, spInstance, uNumOfInstances)
        If (Err.LastHresult = S_OK) And (spInstance IsNot Nothing) Then
            Dim varSize As Variant
            spInstance.Get(StrPtr("MaxClockSpeed"), 0, varSize, 0, 0)
            If Err.LastHresult = S_OK Then
                retSpeed = CLngToULng(varSize)
                If retSpeed = 0 Then
                    retSpeed = 64
                End If
            End If
        End If
        Return retSpeed
    End Function

Changelog

Here are the updates from the past week. You can also find this information by visiting the GitHub twinBASIC Releases page.

Releases · WaynePhillipsEA/twinbasic
Contribute to WaynePhillipsEA/twinbasic development by creating an account on GitHub.

AI-Generated Changelog Summary

* Auto-generated via Claude Sonnet 4, sorted in order of its opinion of "most impactful changes."

Fixed constant expression evaluation errors - Resolved a multiplication bug where constant expressions would fail when initial values exceeded 215, maintaining proper VBA/VB6 compatibility for numeric constant calculations

Improved string handling and data type support - Fixed issues with Val() function returning incorrect results based on OS regional settings, string concatenation failures in loops, and proper Integer-array to string conversion within user-defined types

Enhanced IDE property page functionality - Corrected the ImageList property page "Insert..." button to properly handle multiple file selections, fixing a file path construction issue

Strengthened compiler stability - Resolved potential crashes from Enum member declarations and Erase syntax parsing, plus eliminated compiler restart loops from malformed code

Fixed form designer control alignment - Restored functionality for Left/Center/Right alignment buttons when working with Label and TextBox controls in the visual designer

Improved type library analysis - Added missing [Source] information in disassembled views of type libraries and restored the ability to open Reports in the form designer


WARNING: The following issues are present in each of the releases below:

  • IMPORTANT: This is an interim/experimental release. It includes significant changes, so some instability is to be expected.
  • KNOWN ISSUE: Controls are not being destroyed properly by the form designer, causing big memory leaks (broken in this build)

BETA 867

  • fixed: bad Enum member declarations could cause compiler restart loop
  • fixed: concatenation of literal strings inside a loop could cause runtime failures due to bad constant folding of the concatenation
  • fixed: issue with Val() datatype suffix verification [ dannyb1896, discord ]
  • fixed: support for Integer-array to string from within a UDT [ fafalone, discord ]
  • fixed: datatype suffix characters not always being honoured [#2202]

BETA 868

  • fixed: VBA.Str() function can return the wrong result if OS region system setting "Display Leading Zeros" is turned off [ fan2006, discord ]

BETA 869

  • fixed: ImageList property page "Insert..." button not working for multi-selections [#2207]
  • fixed: form designer mini-bar Left/Center/Right buttons not working for Label and TextBox controls
  • fixed: [Source] missing in some cases in the disassembled view of type libraries [ bclothier, discord ]

BETA 870

  • fixed: (regression) Reports would not open in the form designer [ John, discord ]
  • fixed: potential compiler crash when parsing Erase syntax [ woeoio, discord ]

All original code samples by Mike Wolfe are licensed under CC BY 4.0