Skip to content

新的内置函数

除了前面已经描述的新数据类型相关和组件名称函数外,标准内置VBA库现在包括许多新功能。

新函数

  • IsArrayInitialized(变量) - 确定数组是否已初始化。注意:使用Array()声明为空数组的Variant将返回True
  • RGBA(r, g, b, a) - 像RBG()函数一样,只是包括 alpha 通道。
  • RBG_R(rgba)RGB_B(rgba)RBG_G(rgba)RGBA_A(rgba) - 获取各个通道的值。
  • TranslateColor(颜色值, 可选 调色板) - 将 OLE 颜色值转换为 RGB 颜色。
  • ProcessorArchitecture() - 根据应用程序位数返回vbArchWin32vbArchWin64
  • CallByDispId(对象, 分派 ID, 调用类型, 参数) - 类似于CallByName(),但使用分派 ID 而不是方法名称。
  • RaiseEventByName(对象, 名称, 参数) - 在类上调用事件,使用指定为包含数组的单个Variant的参数。
  • RaiseEventByName2(对象, 名称, 参数1, 参数2, ...) - 在类上调用事件,使用指定为 ParamArray 的参数。
  • PictureToByteArray(StdPicture) - 将图片转换为字节数组;Global.LoadPicture 支持从字节数组加载。
  • CreateGUID() - 返回带有新生成的 GUID 的字符串。
  • AllocMem(大小)FreeMem - 从进程堆分配和释放内存。
  • Int3Breakpoint - 插入对附加外部调试器有帮助的真正断点。
  • GetDeclaredTypeProgId(Of T) / GetDeclaredTypeClsid(Of T)泛型,用于获取 ProgID/CLSID 的字符串。
  • GetDeclaredMinEnumValue(Of T) / GetDeclaredMaxEnumValue(Of T)泛型。
  • 一些Interlocked*函数

来自 msvbvm60.dll 的运行时函数

tB 为一些最常用的运行时函数提供内置支持,以兼容。这些都支持 32 位和 64 位。除非另有说明,所有这些函数以两种方式工作:首先,内置原生版本始终存在(除非您删除基本编译器包),具有最常见的参数排列。这些不需要Declare语句。如果您确实提供了Declare版本,tB 将允许您指定的任何参数排列(例如As Any而不是As LongPtr),如果提供了别名,则映射到别名。

内存函数

  • GetMem1GetMem2GetMem4GetMem8PutMem1PutMem2PutMem4PutMem8
  • 新添加的GetMemPtrPutMemPtr固定到当前指针大小

对象操作

  • vbaObjSetvbaObjSetAddrefvbaCastObjvbaObjAddref用于通过指针操作对象赋值。

数组操作

  • vbaCopyBytesvbaCopyBytesZero
  • vbaAryMovevbaRefVarAry(目前仅在Declare语句中)。
  • tB 也有内置的VarPtr,但仍将通过声明语句重定向调用,例如用于数组的别名(尽管 tB 的VarPtr原生支持数组)。

新的 App 对象属性

  • App.IsInIDE - 从 IDE 运行时为True
  • App.IsElevated - 返回程序当前是否以管理员权限运行。
  • App.LastBuildPath - 返回上次构建的完整路径。在编译器/IDE 重启之间不持久。
  • App.Build - 用于额外的版本号字段。
  • App.ModulePath - 返回当前执行模块的完整路径。例如,如果放在 DLL 中并从 EXE 调用,将返回 DLL 的路径。此外,当方法在应用程序本身时,从 IDE 运行时会给出 twinBASIC 调试器 DLL。

COM 错误处理

直接访问 COM 错误

您可以通过Err.LastHResult检索最后一次 COM 接口调用的HRESULT;这些通常被隐藏并映射到内部错误——COM 接口中通常称为Sub的一切实际上都是返回HRESULT的函数。

设置返回 HRESULT

更重要的是,您现在可以在接口实现中设置HRESULT,使用Err.ReturnHResult。这是一个关键的缺失功能,有时 Err.Raise 会工作,但大多数程序员诉诸复杂 vtable 交换代码来重定向到标准模块函数。例如,您现在可以在预期的地方返回S_FALSE,使用Err.ReturnHResult = S_FALSE

解构赋值

此功能允许您将数组的内容赋值给单个行中的多个变量:

vb
Dim a As Long, b As Long, c As Long
Dim d(2) As Long
d(0) = 1
d(1) = 2
d(2) = 3
Array(a, b, c) = d
Debug.Print a, b, c

这将打印1 2 3。您也可以像这样一次赋值多个变量并获得相同结果:

vb
Dim a As Long, b As Long, c As Long
Array(a, b, c) = Array(1, 2, 3)
Debug.Print a, b, c

您现在也可以做这样的赋值:

vb
Dim a As Long = 9
Dim b As Long = 7
Dim c() As Long = Array(a, b)
Debug.Print c(1), UBound(c)

这将打印7 1

twinBASIC及其LOGO版权为作者"韦恩"所有