Página 1 de 2 1 2 ÚltimoÚltimo
Resultados 1 al 10 de 11

Tema: Compratir variable con un EXE de PowerCOBOL

  1. #1
      Patrocinador del Foro
    R

    Registrado
    febrero de 2015
    Ubicación
    Valladolid
    Mensajes
    79
    Última visita
    13.03.2024

    Agradecimientos
     
    Recibidos
    11
    Enviados
    72

    Citaciones y menciones
     
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    0 Post(s)
    Poder de Reputación
    10

    PC Compratir variable con un EXE de PowerCOBOL

    Cita Iniciado por Kuk Ver Mensaje
    @Recato53, si no quieres que sea una DLL sino un EXE... Puedes intentar hacer un MOVE al RETURN-CODE en el EXE, y en el programa llamante recibes dicho valor en el campo RETURNING. Pruébalo y nos cuentas.
    Buenas tardes.

    Según me indicas puedo programar RETURN-CODE y recogerlo con RETURNING, me puedes hacer llegar un ejemplo, no consigo que esto me funciones.

    Muchas gracias.
    Un saludo.

    0 Not allowed!
    Última edición por Kuk; 09.02.2017 a las 17:11

  2. #2
      Administrador
    Avatar de Kuk

    Registrado
    enero de 2015
    Ubicación
    Madrid
    Edad
    39
    Mensajes
    2,286
    Última visita
    Ayer a las 22:49

    Agradecimientos
     
    Recibidos
    1,036
    Enviados
    888

    Citaciones y menciones
     
    Mentioned
    102 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    31 Post(s)
    Poder de Reputación
    10

    Predeterminado

    @Recato53, lo que puedes hacer es pasar un puntero de una variable en tu DLL que será recuperado por el EXE en la CMD-LINE.

    Es decir, en tu DLL defines una variable y llamas al EXE:
    COBOL Código:
    1.  WORKING-STORAGE SECTION.
    2.  01  EXT-INDICADOR          PIC X(2).
    3.  
    4.  PROCEDURE DIVISION.
    5.      
    6.      INVOKE POW-SELF "ExecuteSync" USING EXT-INDICADOR
    7.      
    8.      IF  EXT-INDICADOR = "SI"
    9.          INVOKE POW-SELF "DisplayMessage"
    10.           USING "¡Hay conexión!" 64
    11.          
    12.      ELSE
    13.          INVOKE POW-SELF "DisplayMessage"
    14.           USING "¡NO hay conexión!" 48
    15.      END-IF

    En tu EXE que comprueba la conexión, en la WORKING Global defines:

    COBOL Código:
    1.  01  GLB-CMD IS GLOBAL         PIC X(260).
    2.  01  FILLER REDEFINES GLB-CMD
    3.      05  PTR-VAR IS GLOBAL     POINTER.
    4.      05  FILLER                PIC X(256).

    Y en el evento "Opened" haces lo siguiente:

    COBOL Código:
    1.      MOVE "CommandLine" OF POW-SELF TO GLB-CMD

    En el evento "Click" de tu botón que llama a la rutina de comprobación de la conexión, añades la LINKAGE SECTION y mapeas la variable de retorno. Ejemplo:

    COBOL Código:
    1.      ENVIRONMENT     DIVISION.
    2.      DATA            DIVISION.
    3.      WORKING-STORAGE SECTION.
    4.      01  FUNC  PIC X(20).
    5.      01  NUM1  PIC S9(9) COMP-5.
    6.      01  NUM2  PIC S9(9) COMP-5.
    7.      01  NUM3  PIC S9(9) COMP-5.
    8.      01  RESP  PIC S9(9) COMP-5.
    9.      
    10.      LINKAGE SECTION.
    11.      01  EXT-VARIABLE     PIC X(2).  *>  <== VARIABLE COMPARTIDA
    12.      PROCEDURE       DIVISION.
    13.              
    14.          MOVE "mluser" TO FUNC
    15.          
    16.          CALL FUNC WITH STDCALL USING BY VALUE NUM1
    17.                                       BY VALUE NUM2
    18.                                       BY VALUE NUM3
    19.                                       RETURNING RESP
    20.                                      
    21.          SET ADDRESS OF EXT-VARIABLE TO PTR-VAR
    22.          
    23.          IF  RESP = ZEROS
    24.              MOVE "NO" TO EXT-VARIABLE
    25.              
    26.          ELSE
    27.              MOVE "SI" TO EXT-VARIABLE
    28.          END-IF

    0 Not allowed!
    ¿Te han ayudado? NO TE OLVIDES de darle al botón
    ¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
    1. Haciendo clic en el icono al lado de su nick
    2. Haciendo clic en el botón en el editor y escribiendo su nick.

  3. #3
      Patrocinador del Foro
    R

    Registrado
    febrero de 2015
    Ubicación
    Valladolid
    Mensajes
    79
    Última visita
    13.03.2024

    Agradecimientos
     
    Recibidos
    11
    Enviados
    72

    Citaciones y menciones
     
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    0 Post(s)
    Poder de Reputación
    10

    Predeterminado

    Buenas tardes KUK.
    Muchisimas gracias por tu interés. He probado la programación que me indicas y no consigo que funcione.

    Creo que me he explicado mal. Te cuento otra vez mi problema.

    Tengo una DLL que llama a un EXE.
    El programa EXE tiene que devolver un valor y desde la DLL recogerlo.

    La programación de la DLL
    COBOL Código:
    1.     WORKING-STORAGE SECTION.
    2.     01 EXT-VARIABLE PIC X(2).
    3.     PROCEDURE DIVISION.
    4.     PRINCIPAL SECTION.
    5.         INVOKE POW-SELF "ExecuteSync" USING "CONEXION.EXE" POW-SWNORMAL.
    6.         IF EXT-VARIABLE = "SI"
    7.            INVOKE POW-SELF "DisplayMessage" USING "¡Hay conexión!" 64
    8.            ELSE
    9.            INVOKE POW-SELF "DisplayMessage" USING "¡NO hay conexión!" 48
    10.         END-IF

    La programación del programa EXE
    COBOL Código:
    1.     WORKING-STORAGE SECTION.
    2. *********************************
    3.     01 CONEXION  PIC X(20).
    4.     01 FUNCION   PIC X(24).
    5.     01 RESP      PIC S9(9) COMP-5.
    6. *********************************  
    7.     01 GLB-CMD IS GLOBAL         PIC X(260).
    8.     01 VALOR REDEFINES GLB-CMD GLOBAL.
    9.        05  PTR-VAR POINTER.
    10.        05  PIC X(256).
    11.     LINKAGE SECTION.
    12.     01 EXT-VARIABLE PIC X(2).  
    13.     PROCEDURE DIVISION.
    14.     PRINCIPAL SECTION.
    15.         MOVE "CommandLine" OF POW-SELF TO GLB-CMD
    16.         MOVE "InternetCheckConnectionA" TO FUNCION
    17.         MOVE "http://www.google.es" TO CONEXION
    18.        
    19.         CALL FUNCION WITH STDCALL USING
    20.               by reference CONEXION
    21.               by value 1
    22.               by value 0
    23.               returning RESP
    24.         END-CALL
    25.        
    26.         SET ADDRESS OF EXT-VARIABLE TO PTR-VAR
    27.        
    28.         IF RESP = ZEROS
    29.            MOVE "NO" TO EXT-VARIABLE
    30.            ELSE
    31.            MOVE "SI" TO EXT-VARIABLE
    32.         END-IF.

    Cuando ejecuto el programa da un error.
    Ficheros adjuntos Ficheros adjuntos

    0 Not allowed!

  4. #4
      Administrador
    Avatar de Kuk

    Registrado
    enero de 2015
    Ubicación
    Madrid
    Edad
    39
    Mensajes
    2,286
    Última visita
    Ayer a las 22:49

    Agradecimientos
     
    Recibidos
    1,036
    Enviados
    888

    Citaciones y menciones
     
    Mentioned
    102 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    31 Post(s)
    Poder de Reputación
    10

    Predeterminado

    @Recato53, pruebalo así:

    COBOL Código:
    1.  ENVIRONMENT     DIVISION.
    2.  DATA            DIVISION.
    3.  WORKING-STORAGE SECTION.    
    4.  01  EXT-VARIABLE    PIC X(2).
    5.  01  WS-PROGRAMA.
    6.      05  WS-NOMBRE   PIC X(13) VALUE "CONEXION.EXE ".
    7.      05  WS-PTR      POINTER.
    8.    
    9.  PROCEDURE DIVISION.
    10.          
    11.      MOVE FUNCTION ADDR(EXT-VARIABLE) TO WS-PTR
    12.        
    13.      INVOKE POW-SELF "ExecuteSync" USING WS-PROGRAMA POW-SWNORMAL.
    14.    
    15.      IF  EXT-VARIABLE = "SI"
    16.          INVOKE POW-SELF "DisplayMessage" USING "¡Hay conexión!" 64
    17.  
    18.      ELSE
    19.          INVOKE POW-SELF "DisplayMessage" USING "¡NO hay conexión!" 48
    20.      END-IF  

    0 Not allowed!
    ¿Te han ayudado? NO TE OLVIDES de darle al botón
    ¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
    1. Haciendo clic en el icono al lado de su nick
    2. Haciendo clic en el botón en el editor y escribiendo su nick.

  5. #5
      Patrocinador del Foro
    R

    Registrado
    febrero de 2015
    Ubicación
    Valladolid
    Mensajes
    79
    Última visita
    13.03.2024

    Agradecimientos
     
    Recibidos
    11
    Enviados
    72

    Citaciones y menciones
     
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    0 Post(s)
    Poder de Reputación
    10

    Predeterminado

    Buenos días.

    Sique sin funcionar estos programas.
    Donde se produce el ERROR es en código del programa.EXE, hay algo que no esta correctamente programado y no encuentro lo que es.

    Muchas gracias

    Un saludo.

    0 Not allowed!

  6. #6
      Administrador
    Avatar de Kuk

    Registrado
    enero de 2015
    Ubicación
    Madrid
    Edad
    39
    Mensajes
    2,286
    Última visita
    Ayer a las 22:49

    Agradecimientos
     
    Recibidos
    1,036
    Enviados
    888

    Citaciones y menciones
     
    Mentioned
    102 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    31 Post(s)
    Poder de Reputación
    10

    Predeterminado

    @Recato53, ahora que lo pienso es normal... Estamos compartiendo memoria en 2 procesos diferentes, y esto no es posible. Para ello hay que reservar de la memoria compartida (shared memory) que es independiente y se controla por el SO.

    Si sigues queriendo hacerlo así puedo mirar cómo se hace, habrá que llamar unas API-s de Windows. Pero en realidad, me sigue pareciendo lo más fácil

    1. sea crear un fichero CONEXION.COB e importarlo en cada módulo (EXE/DLL) del proyecto donde lo necesites, luego hacer un CALL vulgar y corriente.
    2. sea dejarlo todo igual salvo que en vez de un EXE que sea una DLL que se abrirá con CallForm o OpenForm.

    0 Not allowed!
    ¿Te han ayudado? NO TE OLVIDES de darle al botón
    ¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
    1. Haciendo clic en el icono al lado de su nick
    2. Haciendo clic en el botón en el editor y escribiendo su nick.

  7. #7
      Patrocinador del Foro
    R

    Registrado
    febrero de 2015
    Ubicación
    Valladolid
    Mensajes
    79
    Última visita
    13.03.2024

    Agradecimientos
     
    Recibidos
    11
    Enviados
    72

    Citaciones y menciones
     
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    0 Post(s)
    Poder de Reputación
    10

    Predeterminado

    Me gustaría que se pudiera hacer como inicialmente me comentaste.

    Ahora lo tengo resuelto con un archivo Temp.

    En el programa EXE creo un archivo Temp con los valores que me interesan.
    En la DLL abro el archivo Temp y leo los valores.

    Es una solución un poco rudimentaria, pero funciona.

    Un saludo.

    0 Not allowed!

  8. #8
      Administrador
    Avatar de Kuk

    Registrado
    enero de 2015
    Ubicación
    Madrid
    Edad
    39
    Mensajes
    2,286
    Última visita
    Ayer a las 22:49

    Agradecimientos
     
    Recibidos
    1,036
    Enviados
    888

    Citaciones y menciones
     
    Mentioned
    102 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    31 Post(s)
    Poder de Reputación
    10

    Predeterminado
    ¡Solución!1 usuarios han marcado el post como Solución

    @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:

    COBOL Código:
    1.  ENVIRONMENT     DIVISION.
    2.  DATA            DIVISION.
    3.  WORKING-STORAGE SECTION.
    4.  01  hMapFile    BINARY-LONG.
    5.  01  ADR         POINTER.
    6.  01  nADR REDEFINES ADR
    7.                  PIC S9(9) COMP-5.
    8.  01  LastError   PIC S9(9) COMP-5.
    9.  
    10.  LINKAGE SECTION.
    11.  01  InternetRC  PIC S9(4) COMP-5.
    12.  
    13.  PROCEDURE       DIVISION.
    14.      
    15.      *> CREAMOS LA MEMORIA
    16.      CALL "CreateFileMappingA" WITH STDCALL USING BY VALUE -1  *> INVALID_HANDLE_VALUE
    17.                                                   BY VALUE 0   *> NULL
    18.                                                   BY VALUE 4   *> PAGE_READWRITE
    19.                                                   BY VALUE 0  
    20.                                                   BY VALUE 4 *> TAMAÑO MEMORIA EN BYTES
    21.                                                   BY CONTENT "VarComp" & X"00" *> NOMBRE DE LA MEMORIA
    22.                                                   RETURNING hMapFile
    23.      
    24.      *> COMPROBAMOS LA REFERENCIA
    25.      IF  hMapFile = ZEROS
    26.          INVOKE POW-SELF "DisplayMessage"
    27.           USING "Error creando Memoria Compartida" 16
    28.          
    29.          EXIT PROGRAM
    30.      END-IF
    31.      
    32.      *> OBTENEMOS EL PUNTERO
    33.      CALL "MapViewOfFile" WITH STDCALL USING BY VALUE hMapFile
    34.                                              BY VALUE H"0F001F" *> FILE_MAP_ALL_ACCESS
    35.                                              BY VALUE 0
    36.                                              BY VALUE 0
    37.                                              BY VALUE 4 *> TAMAÑO MEMORIA EN BYTES
    38.                                              RETURNING ADR
    39.      
    40.      
    41.      *> SI NO HEMOS OBTENIDO EL PUNTERO, MIRAMOS POR QUE
    42.      IF  ADR = NULL
    43.          CALL "GetLastError" WITH STDCALL RETURNING LastError
    44.          
    45.          INVOKE POW-SELF "DisplayMessage"
    46.           USING "Error creando Memoria Compartida" LastError 16
    47.          
    48.          CALL "CloseHandle" WITH STDCALL USING BY VALUE hMapFile
    49.      
    50.      ELSE
    51.          *> SI TENEMOS EL PUNTERO, MAPEAMOS A LA VARIABLE
    52.          SET ADDRESS OF InternetRC TO ADR
    53.      END-IF
    54.          
    55.      MOVE POW-FALSE TO "Enabled" OF CmCommand1
    56.      
    57.      INVOKE POW-SELF "ExecuteSync" USING "INTERNET.EXE"
    58.      
    59.      MOVE POW-TRUE TO "Enabled" OF CmCommand1
    60.      
    61.      IF  InternetRC = 1
    62.          INVOKE POW-SELF "DisplayMessage"
    63.           USING "¡Hay conexión a Internet!" 64
    64.          
    65.      ELSE
    66.          INVOKE POW-SELF "DisplayMessage"
    67.           USING "NO hay conexión a Internet..." 48
    68.      END-IF          
    69.  
    70.      *> ELIMINAMOS LA MEMORIA CREADA
    71.      CALL "CloseHandle" WITH STDCALL USING BY VALUE hMapFile
    72.          

    En el programa llamado hacemos:

    COBOL Código:
    1.  ENVIRONMENT     DIVISION.
    2.  DATA            DIVISION.
    3.  WORKING-STORAGE SECTION.
    4.  01  hMapFile    BINARY-LONG.
    5.  01  ADR         POINTER.
    6.  01  nADR REDEFINES ADR
    7.                  PIC S9(9) COMP-5.  
    8.  01  LastError   PIC S9(9) COMP-5.              
    9.  
    10.  01 CONEXION     PIC X(30).
    11.  01 ST-INTERNET  PIC S9(9) COMP-5.
    12.  01 FUNC         PIC X(24).    
    13.  
    14.  LINKAGE SECTION.
    15.  01  InternetRC  PIC S9(4) COMP-5.
    16.  PROCEDURE       DIVISION.
    17.          
    18.      MOVE "http://www.google.es" & X"00" TO CONEXION
    19.    
    20.      MOVE "InternetCheckConnectionA" TO FUNC
    21.  
    22.      CALL FUNC WITH STDCALL USING
    23.               by reference CONEXION
    24.               by value 1
    25.               by value 0
    26.               returning ST-INTERNET    
    27.      END-CALL                
    28.      
    29.      *> ACCEDEMOS A LA MEMORIA CREADA
    30.      CALL "OpenFileMappingA" WITH STDCALL USING BY VALUE H"0F001F" *> FILE_MAP_ALL_ACCESS
    31.                                                 BY VALUE 0
    32.                                                 BY CONTENT "VarComp" & X"00" *> NOMBRE DE LA MEMORIA
    33.                                                 RETURNING hMapFile
    34.                                                    
    35.      IF  hMapFile = ZEROS
    36.          INVOKE POW-SELF "DisplayMessage"
    37.           USING "Error accediendo a la Memoria Compartida" 16
    38.          
    39.          EXIT PROGRAM
    40.      END-IF
    41.      
    42.      *> OBTENEMOS EL PUNTERO    
    43.      CALL "MapViewOfFile" WITH STDCALL USING BY VALUE hMapFile
    44.                                              BY VALUE H"0F001F" *> FILE_MAP_ALL_ACCESS
    45.                                              BY VALUE 0
    46.                                              BY VALUE 0
    47.                                              BY VALUE 4
    48.                                              RETURNING ADR
    49.                                                
    50.      IF  ADR = NULL
    51.          CALL "GetLastError" WITH STDCALL RETURNING LastError
    52.          
    53.          INVOKE POW-SELF "DisplayMessage"
    54.           USING "Error obteniendo puntero de Memoria Compartida" LastError 16        
    55.      
    56.      ELSE
    57.          SET ADDRESS OF InternetRC TO ADR
    58.          
    59.          MOVE ST-INTERNET TO InternetRC        
    60.      END-IF

    Incluyo el proyecto por si a caso
    Ficheros adjuntos Ficheros adjuntos

    0 Not allowed!
    ¿Te han ayudado? NO TE OLVIDES de darle al botón
    ¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
    1. Haciendo clic en el icono al lado de su nick
    2. Haciendo clic en el botón en el editor y escribiendo su nick.

  9. #9
      Patrocinador del Foro
    R

    Registrado
    febrero de 2015
    Ubicación
    Valladolid
    Mensajes
    79
    Última visita
    13.03.2024

    Agradecimientos
     
    Recibidos
    11
    Enviados
    72

    Citaciones y menciones
     
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    0 Post(s)
    Poder de Reputación
    10

    Predeterminado

    El archivo .rar, se descarga con una extensión que no se puede descomprimir.

    0 Not allowed!

  10. #10
      Administrador
    Avatar de Kuk

    Registrado
    enero de 2015
    Ubicación
    Madrid
    Edad
    39
    Mensajes
    2,286
    Última visita
    Ayer a las 22:49

    Agradecimientos
     
    Recibidos
    1,036
    Enviados
    888

    Citaciones y menciones
     
    Mentioned
    102 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    31 Post(s)
    Poder de Reputación
    10

    Predeterminado

    @Recato53, a mi me funciona... De todos modos, simplemente renombralo en INTERNET.rar a mano.

    0 Not allowed!
    ¿Te han ayudado? NO TE OLVIDES de darle al botón
    ¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
    1. Haciendo clic en el icono al lado de su nick
    2. Haciendo clic en el botón en el editor y escribiendo su nick.

Página 1 de 2 1 2 ÚltimoÚltimo

Información de Tema

Usuarios Viendo este Tema

Actualmente hay 1 usuarios viendo este tema. (0 miembros y 1 visitantes)

Temas Similares

  1. [Sintaxis] Informar variable JCL con contenido de fichero.
    Por RaulC en el foro JCL y utilidades
    Respuestas: 9
    Último Mensaje: 04.04.2018, 20:47
  2. [Compilador] Libreria Coblib.exe no funciona en RMC11
    Por FerNav en el foro RM/COBOL
    Respuestas: 1
    Último Mensaje: 14.03.2018, 17:20
  3. [Compilador] Fujitsu Cobol for Windows Call EXE
    Por Joseg en el foro NetCOBOL
    Respuestas: 1
    Último Mensaje: 29.10.2016, 23:18
  4. [Información] Leer archivo AcuCobol con PowerCobol
    Por Roger en el foro PowerCOBOL (ActiveX, v4 - v11)
    Respuestas: 7
    Último Mensaje: 28.09.2016, 10:44
  5. [Compilador] Compilar un Ejecutable (.exe)
    Por Yonaider en el foro RM/COBOL
    Respuestas: 5
    Último Mensaje: 26.05.2016, 09:19

Etiquetas para este Tema

Marcadores

Marcadores

Permisos de Publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •