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.

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:
- Custom twinBASIC IDE Installation Guide
- twinBASIC Discord Server (chat about the project)
- twinBASIC Wiki (list of new features not in VBx)
- GitHub Issue Tracker (report bugs)
- twinBASIC/VBx LinkedIn Group
[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 asVal("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 theForm_Resize
orForm_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 theIEnumVARIANT
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).
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.
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 ]