Ohne Magie
Mit Macro für die Parmeter und Prototype für den Aufruf.
Sollte sich die Parameter ändern, brauch diese nur an den Macro durchgeführt werden.
Code: Alles auswählen
;-TOP
; Runtime Procedure mit festen Parametern
Macro RT_Args
p1=0, p2=0, p3=0, p4=0, p5=0, p6=0, p7=0, p8=0
EndMacro
Prototype RT_Invoke(RT_Args)
Runtime Procedure myProc1(RT_Args)
Debug "myProc3: p8 = " + p8
EndProcedure
Runtime Procedure myProc2(RT_Args)
Debug "myProc3: p8 = " + p8
EndProcedure
Runtime Procedure myProc3(RT_Args)
Debug "myProc3: p8 = " + p8
EndProcedure
ProcedureName.s = "myProc1()"
If IsRuntime(ProcedureName)
ProcedureAddress.RT_Invoke = GetRuntimeInteger(ProcedureName)
Debug ProcedureName + " at address: " + ProcedureAddress
If ProcedureAddress
ProcedureAddress() ; OK
EndIf
EndIf
ProcedureName.s = "myProc3()"
If IsRuntime(ProcedureName)
ProcedureAddress.RT_Invoke = GetRuntimeInteger(ProcedureName)
Debug ProcedureName + " at address: " + ProcedureAddress
If ProcedureAddress
ProcedureAddress(1, 2, 3, 4, 5, 6, 7, 8) ; OK
EndIf
EndIf
Um Parameter mit verschiedenen Typen zu übergeben baute ich mir immer ein Variablentype Any zusammen
Code: Alles auswählen
;-TOP
; Runtime Procedure mit festen Parametern
EnableExplicit
Structure udtAny
Type.i
StructureUnion
lVal.l
iVal.i
qVal.q
fltVal.f
dblVal.d
EndStructureUnion
strVal.s
EndStructure
Macro RT_AnyArgs
*p1.udtAny=0, *p2.udtAny=0, *p3.udtAny=0, *p4.udtAny=0, *p5.udtAny=0, *p6.udtAny=0, *p7.udtAny=0, *p8.udtAny=0
EndMacro
Macro SetAny(Var, Value)
Var\Type = TypeOf(Value)
CompilerSelect TypeOf(Value)
CompilerCase #PB_Long
Var\lVal = Value
CompilerCase #PB_Integer
Var\iVal = Value
CompilerCase #PB_Quad
Var\qVal = Value
CompilerCase #PB_Float
Var\fltVal = Value
CompilerCase #PB_Double
Var\dblVal = Value
CompilerCase #PB_String
Var\strVal = Value
CompilerEndSelect
EndMacro
; IDE Helper
Define *p1.udtAny, *p2.udtAny, *p3.udtAny, *p4.udtAny, *p5.udtAny, *p6.udtAny, *p7.udtAny, *p8.udtAny
Prototype RT_Invoke(RT_AnyArgs)
Runtime Procedure myProc1(RT_AnyArgs)
If *p1 And *p1\Type = #PB_String
Debug "Text = " + *p1\strVal
Else
Debug "Error: p1 falscher Type"
EndIf
EndProcedure
Runtime Procedure myProc2(RT_AnyArgs)
Debug "myProc3: p8 = " + *p8
EndProcedure
Runtime Procedure myProc3(RT_AnyArgs)
Debug "myProc3: p8 = " + *p8
EndProcedure
Define.udtAny p1,p2,p3,p4,p5,p6,p7,p8
Define ProcedureName.s = "myProc1()"
Define s1.s = "Hello World"
SetAny(p1.udtAny, s1)
If IsRuntime(ProcedureName)
Define ProcedureAddress.RT_Invoke = GetRuntimeInteger(ProcedureName)
Debug ProcedureName + " at address: " + ProcedureAddress
If ProcedureAddress
ProcedureAddress(p1) ; OK
EndIf
EndIf
If IsRuntime(ProcedureName)
Define ProcedureAddress.RT_Invoke = GetRuntimeInteger(ProcedureName)
Debug ProcedureName + " at address: " + ProcedureAddress
If ProcedureAddress
ProcedureAddress(0) ; OK
EndIf
EndIf
ProcedureName.s = "myProc3()"
If IsRuntime(ProcedureName)
ProcedureAddress.RT_Invoke = GetRuntimeInteger(ProcedureName)
Debug ProcedureName + " at address: " + ProcedureAddress
If ProcedureAddress
ProcedureAddress(1, 2, 3, 4, 5, 6, 7, 8) ; OK
EndIf
EndIf