Visual Basic 6 已经是很古老的技术栈,但在工业现场、设备配置工具、产线看板和长期维护的 Windows 桌面系统里,它仍然真实存在。SonnetDB VB6 连接器的目标不是把 VB6 变成现代平台,而是给这些存量系统一条可控的嵌入式时序数据接入路径。
VB6 连接器第一版包含三部分:
.bas / .cls VB6 源模块.vbp 示例工程SonnetDB 的底层 C ABI 使用 cdecl 调用约定,这是 C、Go、Rust、Java FFM 等生态最自然的选择。但 VB6 的 Declare 语句调用 DLL 时使用 stdcall,并且 VB6 是 32-bit Windows runtime。
所以 VB6 不能直接可靠调用 SonnetDB.Native.dll 的 cdecl 导出函数。连接器加入了一个很小的桥接层:
VB6 应用
│ Declare stdcall
▼
SonnetDB.VB6.Native.dll (x86 stdcall bridge)
│ LoadLibrary/GetProcAddress
▼
SonnetDB.Native.dll (x86 cdecl C ABI)
桥接层还负责 UTF-16 与 UTF-8 字符串转换。VB6 侧使用 Unicode String,SonnetDB C ABI 使用 UTF-8 char*。
VB6 侧提供两个主要类:
SonnetDbConnectionSonnetDbResult示例:
Dim connection As SonnetDbConnection
Dim result As SonnetDbResult
Set connection = New SonnetDbConnection
connection.Open App.Path & "\data-vb6"
connection.ExecuteNonQuery "CREATE MEASUREMENT cpu (host TAG, usage FIELD FLOAT)"
connection.ExecuteNonQuery _
"INSERT INTO cpu (time, host, usage) VALUES " & _
"(1710000000000, 'edge-1', 0.42)"
Set result = connection.Execute("SELECT time, host, usage FROM cpu LIMIT 10")
Do While result.NextRow
Debug.Print result.GetInt64Text(0), result.GetString(1), result.GetDouble(2)
Loop
result.Close
connection.Close
GetInt64 在 VB6 里返回 Double,这是为了兼容 VB6 原生数值能力;如果要保留完整 64-bit 时间戳文本表示,应使用 GetInt64Text。
因为 VB6 是 32-bit runtime,必须构建 x86 版本:
cmake -S connectors/c --preset windows-x86
cmake --build artifacts/connectors/c/win-x86 --config Release
cmake -S connectors/vb6 --preset windows-x86
cmake --build artifacts/connectors/vb6/win-x86 --config Release
运行时把以下文件放在 VB6 exe 旁边,或加入 PATH:
SonnetDB.Native.dllSonnetDB.VB6.Native.dll然后在 VB6 工程中加入:
src/SonnetDbNative.bassrc/SonnetDbConnection.clssrc/SonnetDbResult.clsVB6 连接器不在 GitHub Actions hosted runner 中构建 VB6 工程,也不构建 VB6 产出的动态库。原因很现实:
桥接 DLL 是普通 C 源码,可以在有 Win32 C++ toolchain 的本地机器构建。VB6 工程本身由用户自己的授权环境编译。
VB6 连接器适合这些存量系统:
对这些系统来说,最重要的不是追求最新语言特性,而是低侵入、可部署、可回滚。VB6 连接器的价值正在这里:用一个很小的 bridge,把 SonnetDB 的现代嵌入式时序能力接到经典 Windows 应用里。