Dial a telephone number

The Tapi (Telephony API) can be used to dial a telephone number or pager.
This source is from Johann van der Merwe.
His introduction says:
This is an example of what we use. The code is not cleaned up. We also
use our own dialing properties (for instance a outside line). Hope this
helps. Use MSDN to look up tapiRequestMakeCall for parameter info.

DEFI: DO ON ERROR UNDO, RETURN "ERROR-DEFI":U:
 
  DEFINE INPUT PARAMETER TelNoStr AS CHARACTER NO-UNDO. 
 
  DEFINE VARIABLE GetLine     AS CHARACTER NO-UNDO.
  DEFINE VARIABLE TelNo       AS MEMPTR    NO-UNDO.
  DEFINE VARIABLE i           AS INTEGER   NO-UNDO.
  DEFINE VARIABLE ReturnValue AS INTEGER   NO-UNDO.
END.
 
Main: DO ON ERROR UNDO, RETURN "ERROR-MAIN":U:
 
  GET-KEY-VALUE SECTION "Modem":U KEY "GetLine":U VALUE GetLine.
  IF GetLine = "?":U OR GetLine = ? THEN 
     GetLine = "":U.
 
  SET-SIZE(TelNo) = LENGTH(GetLine + TelNoStr) + 1.
  DO i = 1 TO LENGTH(TelNoStr + GetLine): 
     PUT-BYTE(TelNo,i) = ASC(SUBSTRING(GetLine + TelNoStr,i,1)).
  END.
  PUT-BYTE(TelNo,i) = 0.
  RUN tapiRequestMakeCall (INPUT GET-POINTER-VALUE(TelNo), 
                           INPUT "0":U, 
                           INPUT "0":U, 
                           INPUT "0":U,
                           OUTPUT ReturnValue).
END. 
 
PROCEDURE tapiRequestMakeCall EXTERNAL "tapi32.dll":U:
  DEFINE INPUT  PARAMETER lpszDestAddress AS LONG.
  DEFINE INPUT  PARAMETER lpszAppName     AS CHARACTER.
  DEFINE INPUT  PARAMETER lpszCalledParty AS CHARACTER.
  DEFINE INPUT  PARAMETER lpszComment     AS CHARACTER.
  DEFINE RETURN PARAMETER ReturnValue     AS LONG.
END PROCEDURE.