Kbase P122035: 4GL/ABL: How to get the client and server names of a Terminal Server Session using 4GL?
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  1/2/2009 |
|
Status: Verified
GOAL:
4GL/ABL: How to get the client and server names of a Terminal Server Session using 4GL?
GOAL:
How to access the Computer Name of the current 4GL session?
GOAL:
How to invoke the GetComputerNameA windows API function?
GOAL:
How to invoke the WTSQuerySessionInformationA windows API function?
FACT(s) (Environment):
Windows
Progress 9.x
OpenEdge 10.x
FIX:
The following code returns both the Client and Server Names of a Terminal Server Session:
DEFINE VARIABLE cClientName AS CHARACTER NO-UNDO.
DEFINE VARIABLE cServerName AS CHARACTER NO-UNDO.
ASSIGN
cClientName = OS-GETENV("CLIENTNAME")
cServerName = OS-GETENV("COMPUTERNAME").
MESSAGE cClientName "~t" cServerName
VIEW-AS ALERT-BOX INFO BUTTONS OK.
The following code returns the Computer Name of the current 4GL session or the Client and Server Names of a Terminal Server Session. It also demonstrates how to invoke the GetComputerNameA and the WTSQuerySessionInformationA windows API functions:
&SCOPED-DEFINE MAX_COMPUTERNAME_LENGTH 32
&SCOPED-DEFINE WTS_CURRNET_SERVER_HANDLE 0
&SCOPED-DEFINE WTS_CURRENT_SESSION -1
&SCOPED-DEFINE WTS_INFO_CLASS 10
FUNCTION GetComputerName RETURNS CHARACTER FORWARD.
FUNCTION GetClientName RETURNS CHARACTER FORWARD.
MESSAGE GetClientName() GetComputerName()
VIEW-AS ALERT-BOX INFO BUTTONS OK.
PROCEDURE GetComputerNameA EXTERNAL "kernel32.dll":
DEFINE OUTPUT PARAMETER lpBuffer AS MEMPTR.
DEFINE INPUT-OUTPUT PARAMETER nSize AS LONG.
DEFINE RETURN PARAMETER intResult AS SHORT.
END PROCEDURE.
PROCEDURE WTSQuerySessionInformationA EXTERNAL "Wtsapi32.dll":
DEFINE INPUT PARAMETER hServer AS LONG.
DEFINE INPUT PARAMETER SessionId AS LONG.
DEFINE INPUT PARAMETER WTSInfoClass AS LONG.
DEFINE OUTPUT PARAMETER ppBuffer AS LONG.
DEFINE OUTPUT PARAMETER pBytesReturned AS LONG.
DEFINE RETURN PARAMETER intResult AS LONG.
END PROCEDURE.
FUNCTION GetComputerName RETURNS CHARACTER:
DEFINE VARIABLE iResult AS INTEGER NO-UNDO.
DEFINE VARIABLE iBufferSize AS INTEGER INITIAL {&MAX_COMPUTERNAME_LENGTH} NO-UNDO.
DEFINE VARIABLE lpToString AS MEMPTR NO-UNDO.
DEFINE VARIABLE cComputerName AS CHARACTER NO-UNDO.
SET-SIZE(lpToString) = {&MAX_COMPUTERNAME_LENGTH}.
RUN GetComputerNameA(
OUTPUT lpToString,
INPUT-OUTPUT iBufferSize,
OUTPUT iResult).
IF iResult = 1 THEN
ASSIGN
cComputerName = GET-STRING(lpToString,1).
SET-SIZE(lpToString) = 0.
RETURN (cComputerName).
END FUNCTION.
FUNCTION GetClientName RETURNS CHARACTER:
DEFINE VARIABLE lpInfoClass AS INTEGER NO-UNDO.
DEFINE VARIABLE lpName AS MEMPTR NO-UNDO.
DEFINE VARIABLE ws-client-name AS CHARACTER NO-UNDO.
DEFINE VARIABLE BytesReturned AS INTEGER NO-UNDO.
DEFINE VARIABLE intResult AS INTEGER NO-UNDO.
RUN WTSQuerySessionInformationA(
INPUT {&WTS_CURRNET_SERVER_HANDLE},
INPUT {&WTS_CURRENT_SESSION},
INPUT {&WTS_INFO_CLASS},
OUTPUT lpInfoClass,
OUTPUT BytesReturned,
O.UTPUT intResult).
IF lpInfoClass = 0 THEN RETURN GetComputerName().
SET-POINTER-VALUE(lpName) = lpInfoClass.
ASSIGN
ws-client-name = GET-STRING(lpName,1).
SET-SIZE(lpName) = 0.
RETURN (ws-client-name).
END FUNCTION.
.