[progress Communities] [progress Openedge Abl] Forum Post: Re: I-gettcpinfo Broken In 11.7

Status
Not open for further replies.
G

Garry Hall

Guest
Here is a quick port to do both 32-bit and 64-bit. I chose to use MEMPTRs as input parameters where I could instead of &IF &THEN. It saved some copying pointers in an out of INT/INT64s. This demonstrates the structure changes Matt pointed out. Also note that you have to be aware of datatype alignment within structures. The concern about r-code is still yours to manage, there is nothing I can do about that. /* *****************************************************************************/ &IF {&PROCESS-ARCHITECTURE} = 64 &THEN &SCOPED-DEFINE PTRTYPE INT64 &SCOPED-DEFINE PTRDLLTYPE INT64 &ELSE &SCOPED-DEFINE PTRTYPE INT &SCOPED-DEFINE PTRDLLTYPE LONG &ENDIF &SCOPED-DEFINE WSADESCRIPTION_LEN 256 &SCOPED-DEFINE WSASYS_STATUS_LEN 128 &SCOPED-DEFINE WSADATA_VERSION_LOW 1 /* WORD(2) */ &SCOPED-DEFINE WSADATA_VERSION_HIGH 3 /* WORD(2) */ &SCOPED-DEFINE WSADATA_DESCRIPTION 5 /* CHAR(WSADESCRIPTION_LEN + 1) */ &SCOPED-DEFINE WSADATA_SYSTEM_STATUS 262 /* CHAR(WSASYS_STATUS_LEN + 1) */ &SCOPED-DEFINE WSADATA_MAX_SOCKETS 391 /* SHORT(4) */ &SCOPED-DEFINE WSADATA_MAX_UDP 395 /* SHORT(4) */ &SCOPED-DEFINE WSADATA_VENDOR_INFO 399 /* CHAR*(4) */ &IF {&PROCESS-ARCHITECTURE} = 64 &THEN &SCOPED-DEFINE WSADATA_LENGTH 407 &ELSE &SCOPED-DEFINE WSADATA_LENGTH 403 &ENDIF &IF {&PROCESS-ARCHITECTURE} = 64 &THEN &SCOPED-DEFINE HOSTENT_NAME 1 /* CHAR*(8) */ &SCOPED-DEFINE HOSTENT_ALIASES 9 /* CHAR**(8) */ &SCOPED-DEFINE HOSTENT_ADDR_TYPE 17 /* SHORT(2) */ &SCOPED-DEFINE HOSTENT_ADDR_LENGTH 19 /* SHORT(2) */ &SCOPED-DEFINE HOSTENT_ADDR_LIST 25 /* CHAR**(8), and alignment */ &SCOPED-DEFINE HOSTENT_LENGTH 33 &ELSE &SCOPED-DEFINE HOSTENT_NAME 1 /* CHAR*(4) */ &SCOPED-DEFINE HOSTENT_ALIASES 5 /* CHAR**(4) */ &SCOPED-DEFINE HOSTENT_ADDR_TYPE 9 /* SHORT(2) */ &SCOPED-DEFINE HOSTENT_ADDR_LENGTH 11 /* SHORT(2) */ &SCOPED-DEFINE HOSTENT_ADDR_LIST 13 /* CHAR**(4) */ &SCOPED-DEFINE HOSTENT_LENGTH 16 &ENDIF DEF VAR cHostName AS CHAR INIT "pcHostName" NO-UNDO. DEF VAR cHostAddress AS CHAR NO-UNDO. RUN i-GetTcpInfo ( INPUT-OUTPUT cHostName, OUTPUT cHostAddress). MESSAGE cHostname SKIP cHostAddress VIEW-AS ALERT-BOX. PROCEDURE i-GetTcpInfo: /*------------------------------------------------------------------------ Procedure : i-GetTcpInfo Description : Return the windows TCP host name and address of any PC. Parms : - Host name. (INPUT-OUTPUT, CHARACTER) - Host address. (OUTPUT, CHARACTER): Sample usage: RUN i-GetTcpInfo (OUTPUT w-TcpName, OUTPUT w-TcpAddr). Notes : - ------------------------------------------------------------------------*/ DEFINE INPUT-OUTPUT PARAMETER p-TcpName AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER p-TcpAddr AS CHARACTER NO-UNDO. DEFINE VARIABLE w-TcpName AS CHARACTER NO-UNDO. DEFINE VARIABLE w-Length AS INTEGER NO-UNDO. DEFINE VARIABLE w-Return AS INTEGER NO-UNDO. DEFINE VARIABLE ptr-WsaData AS MEMPTR NO-UNDO. DEFINE VARIABLE w-Hostent AS INTEGER NO-UNDO. DEFINE VARIABLE ptr-Hostent AS MEMPTR NO-UNDO. DEFINE VARIABLE ptr-AddrString AS MEMPTR NO-UNDO. DEFINE VARIABLE ptr-AddrList AS MEMPTR NO-UNDO. DEFINE VARIABLE ptr-ListEntry AS MEMPTR NO-UNDO. DEFINE VARIABLE w-TcpPtr AS {&PTRTYPE} NO-UNDO. /* Initialize return values */ ASSIGN p-TcpAddr = ? . /* Allocate work structure for WSADATA */ SET-SIZE(ptr-WsaData) = {&WSADATA_LENGTH}. /* Ask Win32 for winsock usage */ RUN WSAStartup (INPUT 257, /* requested version 1.1 */ INPUT ptr-WsaData, OUTPUT w-Return). /* Release allocated memory */ SET-SIZE(ptr-WsaData) = 0. /* Check for errors */ IF w-Return NE 0 THEN DO: MESSAGE "Error accessing WINSOCK support." VIEW-AS ALERT-BOX. RETURN. END. w-TcpName = p-TcpName. /* Call Win32 routine to get host address */ RUN gethostbyname (INPUT w-TcpName, OUTPUT ptr-Hostent). /* Check for errors */ IF get-pointer-value(ptr-Hostent) EQ 0 THEN DO: MESSAGE "Error resolving host name." VIEW-AS ALERT-BOX. RUN WSACleanup (OUTPUT w-Return). RETURN. END. /* Set pointer to HostEnt data structure */ /* "Chase" pointers to get to first address list entry */ &IF {&PROCESS-ARCHITECTURE} = 64 &THEN SET-POINTER-VALUE(ptr-AddrList) = GET-INT64(ptr-Hostent, {&HOSTENT_ADDR_LIST}). SET-POINTER-VALUE(ptr-ListEntry) = GET-INT64(ptr-AddrList, 1). w-TcpPtr = GET-INT64(ptr-ListEntry, 1). &ELSE SET-POINTER-VALUE(ptr-AddrList) = GET-LONG(ptr-Hostent, {&HOSTENT_ADDR_LIST}). SET-POINTER-VALUE(ptr-ListEntry) = GET-LONG(ptr-AddrList, 1). w-TcpPtr = GET-LONG(ptr-ListEntry, 1). &ENDIF RUN inet_ntoa (INPUT w-TcpPtr , OUTPUT ptr-AddrString). /* Pass back gathered info */ p-TcpAddr = GET-STRING(ptr-AddrString, 1). /* Terminate winsock usage */ RUN WSACleanup (OUTPUT w-Return). END PROCEDURE. PROCEDURE gethostbyname EXTERNAL "wsock32.dll" : DEFINE INPUT PARAMETER p-Name AS CHARACTER. DEFINE RETURN PARAMETER p-Hostent AS MEMPTR. END PROCEDURE. PROCEDURE inet_ntoa EXTERNAL "wsock32.dll" : DEFINE INPUT PARAMETER p-AddrStruct AS {&PTRDLLTYPE}. DEFINE RETURN PARAMETER p-AddrString AS MEMPTR. END PROCEDURE. PROCEDURE WSAStartup EXTERNAL "wsock32.dll" : DEFINE INPUT PARAMETER p-VersionReq AS SHORT. DEFINE INPUT PARAMETER ptr-WsaData AS HANDLE TO MEMPTR. DEFINE RETURN PARAMETER p-Return AS LONG. END PROCEDURE. PROCEDURE WSACleanup EXTERNAL "wsock32": DEFINE RETURN PARAMETER p-Return AS LONG. END PROCEDURE.

Continue reading...
 
Status
Not open for further replies.
Top