Variant String Append
<< Back
Prior to DF 20.1, there is a limit on the length of all strings. The limit is set by Set_Argument_Size. In VDF 16.1, it is
set to 65536 bytes by default. In DF 20.1, DAW has gotten rid of the need of "Set_Argument_Size". This article is for those who still
live in the pre DF 20.1 world.
In a recent post, Samuel Pizarro was misled by the DF online help (which was later "corrected")
that variant string was not affected by the "Argument_Size" limitation. Alas, variant strings are still affected by "Argument_Size"
in the pre DF 20.1 world. Samuel is wondering how he could overcome such limitation. Obviously one
could simply jack up the Argument_Size to as big as you need. However I feel like we are solving a local problem with a global solution.
To learn more about Argument_Size, please read this excellent blog post written by Sonny Falk (Please come back, pretty please!!!!!) about Argument_Size.
So, here it is, a small global function to allow you to append to a variant string for as long as you like (limited by the
memory of the OS, of course). It will work with VDF 11.1+ (I haven't tested anything older than VDF 11.1)
Use UI
External_Function VarBstrCat "VarBstrCat" OLEAUT32.DLL Pointer p1 Pointer p2 Pointer p3 Returns Integer
#IF !@<200
#REPLACE STOREPTR STOREDW
#REPLACE DEREFPTR DEREFDW
#ENDIF
Function AppendV Global Variant v1 Variant v2 Returns Variant
#IF !@<201
Pointer p
Variant v3
Boolean bOK
Move v1 to v1
Move v2 to v2
If (DeRefW(AddressOf(v1), 0) = 8 and DeRefW(AddressOf(v2), 0) = 8) Begin
Move 0 to p
If (VarBstrCat(DeRefPtr(AddressOf(v1), 8), DeRefPtr(AddressOf(v2), 8), AddressOf(p)) = 0) Begin
Move 0 to v3
Move (StoreW(AddressOf(v3), 0, 8)) to bOK
Move (StorePtr(AddressOf(v3), 8, p)) to bOK
Function_Return v3
End
End
#ENDIF
Function_Return (v1 + v2)
End_Function