Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Compilador] Processo/EXE ativo (https://www.cobolforo.es/showthread.php?t=1802)

Joseg 11 de noviembre de 2024 10:30

Buenos días Kuk :)

Se compila sin errores, pero el programa no se ejecuta.
Dando el mensaje:
EXCEPTION_ACCESS_VIOLATION(C0000005)

¿El programa "EnumWindowsProc" no tiene cambios?

Gracias,
José

Kuk 11 de noviembre de 2024 10:47

@Joseg, a lo mejor no le has pasado ningún Nº de PID, porque a mi me funciona sin fallos.

También haz "Rebuild ALL" por si acaso. Aveces falla si no recompilamos por completo el proyecto (para refrescar todos los cachés, el Build es incremental).

No, en "EnumWindowsProc" no he hecho ningún cambio.

Joseg 11 de noviembre de 2024 11:59

Cita:

Citación del post de Kuk (Mensaje 9627)
@Joseg, a lo mejor no le has pasado ningún Nº de PID, porque a mi me funciona sin fallos.

También haz "Rebuild ALL" por si acaso. Aveces falla si no recompilamos por completo el proyecto (para refrescar todos los cachés, el Build es incremental).

No, en "EnumWindowsProc" no he hecho ningún cambio.

Fiz "RebuildAll"
Powercobol 9.0

Código COBOL:
  1.      call "GetProcAddress" with stdcall using by value hModule
  2.                                               by content "EnumWindowsProc@8" & X"00"
  3.                                               returning pAddress

---> returning pAddress ---> pAddress = 0

Gracias

Kuk 11 de noviembre de 2024 12:46

@Joseg, es que el nombre que le pones no es correcto. Desde fuera se le añade un guion bajo, por eso en vez de EnumWindowsProc@8 debe ser _EnumWindowsProc@8, por eso no te funciona. Copia y pega el código que puse yo tal cual y verás que funciona. ;)

fastpho 11 de noviembre de 2024 13:19

Hola @Kuk , esto es buenisimo por que desde powercobol 5.0
no puedo usar procedure-pointer , habia intentado de
muchas formas poder llamar a una funcion y realizar un
callback , con este procediemiento ahora puedo
muchas gracias.

Probe el ejemplo de llamar a un .exe por Procees_id y me funciono
perfecto.

Saludos ...

Joseg 11 de noviembre de 2024 13:30

Cita:

Citación del post de Kuk (Mensaje 9629)
@Joseg, es que el nombre que le pones no es correcto. Desde fuera se le añade un guion bajo, por eso en vez de EnumWindowsProc@8 debe ser _EnumWindowsProc@8, por eso no te funciona. Copia y pega el código que puse yo tal cual y verás que funciona. ;)

Primero probé _EnumWindowsProc@8, pero igualmente sin éxito.
Estoy haciendo esta llamada desde una DLL, ¿solo funciona si la llamo desde un EXE?

Gracias

fastpho 11 de noviembre de 2024 13:41

Hola @Joseg , probe desde una dll y me funciono :mola::mola:
Saludos

Kuk 11 de noviembre de 2024 13:44

1 Archivos Adjunto(s)
@Joseg, has probado copiando mi código tal cual? A lo mejor hay algún pequeño error en alguna parte. Es muy raro que no te funcione, no tiene "explicación científica" y nos funciona a 2 personas... :piensa:
Si funciona en un EXE, en una DLL debe funcionar con más razón porque las DLLs son pensadas para compartir funciones, los EXE son los puntos de entrada (que lo pueden hacer también pero es más raro). En este caso con el EXE egenrado por PowerCOBOL va sujeto al Run-Time, tiene siempre expuesto el punto de entrada MAINFORM. Y si hay funciones añadidas por nosotros, también aparecen:

[ATTACH=CONFIG]1007[/ATTACH]

@fastpho, no sabía que PowerCOBOL v5 no tenía tampoco PROCEDURE-POINTER. Me alegro de que te sirva el invento :bien:

Joseg 11 de noviembre de 2024 16:51

1 Archivos Adjunto(s)
Cita:

Citación del post de Kuk (Mensaje 9633)
@Joseg, has probado copiando mi código tal cual? A lo mejor hay algún pequeño error en alguna parte. Es muy raro que no te funcione, no tiene "explicación científica" y nos funciona a 2 personas... :piensa:
Si funciona en un EXE, en una DLL debe funcionar con más razón porque las DLLs son pensadas para compartir funciones, los EXE son los puntos de entrada (que lo pueden hacer también pero es más raro). En este caso con el EXE egenrado por PowerCOBOL va sujeto al Run-Time, tiene siempre expuesto el punto de entrada MAINFORM. Y si hay funciones añadidas por nosotros, también aparecen:

[ATTACH=CONFIG]1007[/ATTACH]

@fastpho, no sabía que PowerCOBOL v5 no tenía tampoco PROCEDURE-POINTER. Me alegro de que te sirva el invento :bien:


Ok, usaré la primera forma. Llamarlo vía EXE funciona, vía DLL no funciona en absoluto.

Kuk 11 de noviembre de 2024 21:05

@Joseg, mea culpa, es que hay un detalle importante! Efectivamente, no puede funcionar TAL CUAL en una DLL porque GetModuleHandleA, si no le damos nombre del módulo sino que le pasamos un NULO, devuelve el hModule del EXE que se cargó inicialmente (el Main, vamos). Así que luego GetProcAddress, aunque lo llamamos en una DLL, le pasamos el hModule que obtuvimos del EXE, y evidentemente no encuentra "EnumWindowsProc", (a no ser que también esté presente en el EXE).

Por lo tanto, si lo queremos hacer SOLO en una DLL, lo que hay que hacer es pasarle a GetModuleHandleA el nombre de la DLL en parámetro en vez de un NULO. Es decir, reemplazar:
Código COBOL:
  1. call "GetModuleHandleA" with stdcall using by value h"00" returning hModule

por
Código COBOL:
  1. call "GetModuleHandleA" with stdcall using by content "RgestAPI.dll" returning hModule

O si no, dejar el fichero "EnumWindowsProc" en el EXE y no meterlo en la DLL. De hecho es por eso que a @fastpho le ha funcionado, seguro que ha dejado el fichero "EnumWindowsProc" en el EXE pero hizo la llamada a GetProcAddress en la DLL pasándole el hModule del EXE que obtuvo llamando a GetModuleHandleA con el parámetro a NULO (h"00").

No sé si me he explicado bien.


La franja horaria es GMT +2. Ahora son las 02:43.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.