Recato53, aquí tienes lo que necesitas, lo he comprobado y funciona. En realidad es un ejemplo de cómo compartir memoria entre 2 procesos.
En el programa llamante hacemos:
Código COBOL:
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 hMapFile BINARY-LONG.
01 ADR POINTER.
01 nADR REDEFINES ADR
PIC S9(9) COMP-5.
01 LastError PIC S9(9) COMP-5.
LINKAGE SECTION.
01 InternetRC PIC S9(4) COMP-5.
PROCEDURE DIVISION.
*> CREAMOS LA MEMORIA
CALL "CreateFileMappingA" WITH STDCALL USING BY VALUE -1 *> INVALID_HANDLE_VALUE
BY VALUE 0 *> NULL
BY VALUE 4 *> PAGE_READWRITE
BY VALUE 0
BY VALUE 4 *> TAMAÑO MEMORIA EN BYTES
BY CONTENT "VarComp" & X"00" *> NOMBRE DE LA MEMORIA
RETURNING hMapFile
*> COMPROBAMOS LA REFERENCIA
IF hMapFile = ZEROS
INVOKE POW-SELF "DisplayMessage"
USING "Error creando Memoria Compartida" 16
EXIT PROGRAM
END-IF
*> OBTENEMOS EL PUNTERO
CALL "MapViewOfFile" WITH STDCALL USING BY VALUE hMapFile
BY VALUE H"0F001F" *> FILE_MAP_ALL_ACCESS
BY VALUE 0
BY VALUE 0
BY VALUE 4 *> TAMAÑO MEMORIA EN BYTES
RETURNING ADR
*> SI NO HEMOS OBTENIDO EL PUNTERO, MIRAMOS POR QUE
IF ADR = NULL
CALL "GetLastError" WITH STDCALL RETURNING LastError
INVOKE POW-SELF "DisplayMessage"
USING "Error creando Memoria Compartida" LastError 16
CALL "CloseHandle" WITH STDCALL USING BY VALUE hMapFile
ELSE
*> SI TENEMOS EL PUNTERO, MAPEAMOS A LA VARIABLE
SET ADDRESS OF InternetRC TO ADR
END-IF
MOVE POW-FALSE TO "Enabled" OF CmCommand1
INVOKE POW-SELF "ExecuteSync" USING "INTERNET.EXE"
MOVE POW-TRUE TO "Enabled" OF CmCommand1
IF InternetRC = 1
INVOKE POW-SELF "DisplayMessage"
USING "¡Hay conexión a Internet!" 64
ELSE
INVOKE POW-SELF "DisplayMessage"
USING "NO hay conexión a Internet..." 48
END-IF
*> ELIMINAMOS LA MEMORIA CREADA
CALL "CloseHandle" WITH STDCALL USING BY VALUE hMapFile
En el programa llamado hacemos:
Código COBOL:
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 hMapFile BINARY-LONG.
01 ADR POINTER.
01 nADR REDEFINES ADR
PIC S9(9) COMP-5.
01 LastError PIC S9(9) COMP-5.
01 CONEXION PIC X(30).
01 ST-INTERNET PIC S9(9) COMP-5.
01 FUNC PIC X(24).
LINKAGE SECTION.
01 InternetRC PIC S9(4) COMP-5.
PROCEDURE DIVISION.
MOVE "http://www.google.es" & X"00" TO CONEXION
MOVE "InternetCheckConnectionA" TO FUNC
CALL FUNC WITH STDCALL USING
by reference CONEXION
by value 1
by value 0
returning ST-INTERNET
END-CALL
*> ACCEDEMOS A LA MEMORIA CREADA
CALL "OpenFileMappingA" WITH STDCALL USING BY VALUE H"0F001F" *> FILE_MAP_ALL_ACCESS
BY VALUE 0
BY CONTENT "VarComp" & X"00" *> NOMBRE DE LA MEMORIA
RETURNING hMapFile
IF hMapFile = ZEROS
INVOKE POW-SELF "DisplayMessage"
USING "Error accediendo a la Memoria Compartida" 16
EXIT PROGRAM
END-IF
*> OBTENEMOS EL PUNTERO
CALL "MapViewOfFile" WITH STDCALL USING BY VALUE hMapFile
BY VALUE H"0F001F" *> FILE_MAP_ALL_ACCESS
BY VALUE 0
BY VALUE 0
BY VALUE 4
RETURNING ADR
IF ADR = NULL
CALL "GetLastError" WITH STDCALL RETURNING LastError
INVOKE POW-SELF "DisplayMessage"
USING "Error obteniendo puntero de Memoria Compartida" LastError 16
ELSE
SET ADDRESS OF InternetRC TO ADR
MOVE ST-INTERNET TO InternetRC
END-IF
Incluyo el proyecto por si a caso
