New Built-in Functions
In addition to the new datatype-related and component name functions already described, the standard builtin VBA library now includes many new capabilities.
New Functions
IsArrayInitialized(variable)- Determines if an array is initialized. Note: AVariantdeclared as empty array withArray()will returnTrue.RGBA(r, g, b, a)- Like theRBG()function, only including the alpha channel.RBG_R(rgba),RGB_B(rgba),RBG_G(rgba), andRGBA_A(rgba)- Get the values for individual channels.TranslateColor(ColorValue, Optional Palette)- Translates an OLE color value to an RGB color.ProcessorArchitecture()- Returns eithervbArchWin32orvbArchWin64, depending on application bitness.CallByDispId(Object, DispId, CallType, Arguments)- Similar toCallByName(), but uses the dispatch id instead of method name.RaiseEventByName(Object, Name, Args)- Invokes an event on class, using arguments specified as a singleVariantcontaining an array.RaiseEventByName2(Object, Name, Arg1, Arg2, ...)- Invokes an event on class, using arguments specified as a ParamArray.PictureToByteArray(StdPicture)- Converts a picture to a byte array; Global.LoadPicture supports loading from byte arrays.CreateGUID()- Returns a string with a freshly generated GUID.AllocMem(size)andFreeMem- allocate and free memory from the process heap.Int3Breakpoint- Inserts a true breakpoint helpful for attached external debuggers.GetDeclaredTypeProgId(Of T)/GetDeclaredTypeClsid(Of T)generics for getting strings of ProgID/CLSID.GetDeclaredMinEnumValue(Of T)/GetDeclaredMaxEnumValue(Of T)generics.- Some
Interlocked*functions
Runtime Functions from msvbvm60.dll
tB has built in support for some of the most commonly used runtime functions, for compatibility. These all support both 32 and 64bit. Unless otherwise noted, all of these function in two ways: First, built in native versions that are always present (unless you remove the basic compiler packages), with the most common arrangements of arguments. These don’t require a Declare statement. If you do provide a Declare version, tB will allow whatever arrangements of arguments you specify (e.g. As Any instead of As LongPtr), mapped to an alias if provided.
Memory Functions
GetMem1,GetMem2,GetMem4,GetMem8,PutMem1,PutMem2,PutMem4,PutMem8- New additions
GetMemPtrandPutMemPtrpegged to the current pointer size
Object Manipulation
vbaObjSet,vbaObjSetAddref,vbaCastObj, andvbaObjAddreffor manipulating object assignments through pointers.
Array Operations
vbaCopyBytesandvbaCopyBytesZerovbaAryMoveandvbaRefVarAry(currently only with aDeclarestatement).- tB also has an instrinsic
VarPtrbut will still redirect calls via a declare statement, e.g. aliases used for arrays (though tB’sVarPtrsupports arrays natively).
New App Object Properties
App.IsInIDE-Truewhen running from the IDE.App.IsElevated- Returns whether the program is currently running with administrator rights.App.LastBuildPath- Returns the full path of the last build. Does not persist between compiler/IDE restarts.App.Build- For the additional version number field.App.ModulePath- Returns the full path of the currently executing module. For example, if placed in a DLL and called from an EXE, the path of the DLL would be returned. Also, the twinBASIC debugger DLL is given when running from the IDE, when the method is in the app itself.
COM Error Handling
Direct Access to COM Errors
You can retrieve the last HRESULT to a COM interface call via Err.LastHResult; these are usually hidden and mapped to internal errors– everything in a COM interface normally called a Sub is actually an HRESULT-returning function.
Setting Return HRESULT
More importantly, you can now set the HRESULT in interface implementations with Err.ReturnHResult. This was a critical missing feature for which sometimes Err.Raise would work, but mostly programmers resorted to complicated vtable-swapping code to redirect to a standard module function. For instance you can now return S_FALSE where expected with Err.ReturnHResult = S_FALSE.
Destructuring Assignment
This feature allows you to assign the contents of an array to multiple variables in a single line:
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
This would print 1 2 3. You could also assign multiple variables at once like this and get the same result:
Dim a As Long, b As Long, c As Long
Array(a, b, c) = Array(1, 2, 3)
Debug.Print a, b, c
You can now also do assignments like this:
Dim a As Long = 9
Dim b As Long = 7
Dim c() As Long = Array(a, b)
Debug.Print c(1), UBound(c)
Which prints 7 1.