Platforms to show: All Mac Windows Linux Cross-Platform

/Util/Dynamic Declare


Required plugins for this example: MBS Compression Plugin, MBS Util Plugin

Last modified Fri, 7th May 2020.

You find this example project in your MBS Xojo Plugin download as a Xojo project file within the examples folder: /Util/Dynamic Declare

Download this example: Dynamic Declare.zip

Project "Dynamic Declare.xojo_binary_project"
Class App Inherits Application
Const kEditClear = "&Delete"
Const kFileQuit = "&Quit"
Const kFileQuitShortcut = ""
EventHandler Sub Open() #if TargetMacOS then // change path if you like to try this on Windows or Linux Dim d As New DeclareLibraryMBS("/usr/lib/libz.1.dylib") Dim lines() As String = d.SymbolNames Break // look in list of functions // zlibVersion // ZEXTERN Const char * ZEXPORT zlibVersion Of((void)); Dim p As ptr = d.Symbol("zlibVersion") Dim f As New DeclareFunctionMBS("()Z", p) Dim n As String = f.Invoke MsgBox "zlibVersion: "+n // CRC // ZEXTERN uLong ZEXPORT crc32 Of((uLong crc, Const Bytef *buf, uInt Len)); // uLong is 32/64-bit on Mac, but may be always 32-bit on Windows, so we use long as type here Dim s As String = "Hello World" Dim CRCStartValue As Integer = 0 p = d.Symbol("crc32") f = New DeclareFunctionMBS("(LpI)L", p) f.ParameterInteger(0) = CRCStartValue f.ParameterString(1) = s f.ParameterInteger(2) = s.LenB Dim crc As UInt32 = f.Invoke Dim crcPlugin As UInt32 = CRC32StringMBS(CRCStartValue, s) MsgBox "Declare: "+str(crc)+EndOfLine+"Plugin: "+str(crcPlugin) #EndIf End EventHandler
End Class
Class MainWindow Inherits Window
Control List Inherits Listbox
ControlInstance List Inherits Listbox
End Control
EventHandler Sub Open() // one int32 parameter and return int32 Dim v1() As Variant v1.Append 345 test "i)i", 123, v1 // various parameters Dim m2 As New MemoryBlock(4) Dim p2 As ptr = m2 Dim v2() As Variant dim s2() as string v2.Append 1 s2.Append MyCallback.kTypeBool v2.Append -123 s2.Append MyCallback.kTypeChar v2.Append 123 s2.Append MyCallback.kTypeUnsignedChar v2.Append -1234 s2.Append MyCallback.kTypeShort v2.Append 1234 s2.Append MyCallback.kTypeUnsignedShort v2.Append -12345678 s2.Append MyCallback.kTypeInt v2.Append 12345678 s2.Append MyCallback.kTypeUnsignedInt v2.Append -12345678 s2.Append MyCallback.kTypeLong v2.Append 12345678 s2.Append MyCallback.kTypeUnsignedLong v2.Append -1234567890123 s2.Append MyCallback.kTypeInt64 v2.Append 1234567890123 s2.Append MyCallback.kTypeUnsignedInt64 v2.Append CType(12.34, Single) // avoid passing as double s2.Append MyCallback.kTypeFloat v2.Append 123.456 s2.Append MyCallback.kTypeDouble v2.Append p2 s2.Append MyCallback.kTypePtr v2.Append "Hello World" s2.Append MyCallback.kTypeString // return s2.Append MyCallback.kTypeEndArg s2.Append MyCallback.kTypeVoid Dim sig2 As String = Join(s2,"") test sig2, Nil, v2 Dim v3() As Variant v3.Append 345 test "i)Z", "Hello World", v3 // test pointer return Dim v4() As Variant v4.Append 345 test "i)p", p2, v4 // test double Dim v5() As Variant test ")d", 2.5, v5 Log "done" Break // no crash till here? Great! End EventHandler
Sub Log(s as string) List.AddRow s End Sub
Sub test(signature as string, Result as Variant, TestParameters() as Variant) Dim c As New MyCallback(signature) Dim f As New MyFunction(signature, c.FunctionPtr) c.Result = Result Dim r As Variant = f.Invoke(TestParameters) If r <> c.Result Then Log "Result is not matching for " + signature Break // failed Else // okay End If Dim ParametersReceived() As Variant = c.ParametersReceived Dim u As Integer = TestParameters.Ubound For i As Integer = 0 To u Dim ParameterReceived As Variant = ParametersReceived(i) Dim TestParameter As Variant = TestParameters(i) If ParameterReceived <> TestParameter Then Log Str(i)+"th parameter not matching for " + signature Break // failed End If Next End Sub
End Class
MenuBar MainMenuBar
MenuItem FileMenu = "&File"
MenuItem FileQuit = "#App.kFileQuit"
MenuItem EditMenu = "&Edit"
MenuItem EditUndo = "&Undo"
MenuItem EditSeparator1 = "-"
MenuItem EditCut = "Cu&t"
MenuItem EditCopy = "&Copy"
MenuItem EditPaste = "&Paste"
MenuItem EditClear = "#App.kEditClear"
MenuItem EditSeparator2 = "-"
MenuItem EditSelectAll = "Select &All"
End MenuBar
Class MyCallback Inherits DeclareCallBackMBS
EventHandler Function Callback(Parameters() as Variant) As Variant Self.ParametersReceived = Parameters Return result End EventHandler
Property ParametersReceived() As Variant
Property Result As Variant
End Class
Class MyFunction Inherits declareFunctionMBS
End Class
End Project

Download this example: Dynamic Declare.zip

The items on this page are in the following plugins: MBS Util Plugin.


The biggest plugin in space...