External$Function Command Flag GET_|MSG_ FunctionName {"FunctionName"} DLLName {Parameters ...} Returns DataType
#IFTYPE !5 S
// check that the function name is not one of our reserved internal functions
#IFSAME !3 GET_
#IFSAME FN$!4 __F__
#ERROR DFERR_COMP_ILLEGAL_EXTERNAL_FUNCTION_DEFINTION !4 is an internal function name
#ENDIF
#ENDIF
#IFDEF !3!4 // if defined as object, function, property, external, an error
// We have an error. This just generates more accurate information
#IFSAME !3 GET_ // function errors can be name already used as Object, global function, or reg function
#IF (GET_!4>$40000000)
#ERROR DFERR_COMP_ILLEGAL_EXTERNAL_FUNCTION_DEFINTION !4 is already defined as an object
#ELSE
#IF (GET_!4<0)
#ERROR DFERR_COMP_ILLEGAL_EXTERNAL_FUNCTION_DEFINTION !4 is already defined as a global function
#ELSE
#ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION !4 is already defined as a function or external_function
#ENDIF
#ENDIF
#ELSE // if procecure it can be global or regular
#IF (MSG_!4<0)
#ERROR DFERR_COMP_ILLEGAL_EXTERNAL_FUNCTION_DEFINTION !4 is already defined as a global procedure
#ELSE
#ERROR DFERR_COMP_ILLEGAL_EXTERNAL_FUNCTION_DEFINTION !4 is already defined as a procedure or external_procedure
#ENDIF
#ENDIF
#ELSE
MESSAGE$ADDRESS !3!4 // create any symbol (for global)
CHECK$METHOD$ARGUMENT$LIST !7 !8 !9
#DATA
#FREG !3!4 GLOBAL !7 !8 !9
#DPUSH !3!4 // Message ID
#DPUSH !2 // Load Type
#DPUSH |CS"!6" // DLL Name
#DPUSH !5 // Function Name
GET$RETURN$TYPE !7 !8 !9 // Push Return Type
!A [] !1 |CI0 |VL
#ENDIF
#ELSE
EXTERNAL$FUNCTION !1 !2 !3 !4 |CS"!4" !5 !6 !7 !8 !9
#ENDIF