![]() |
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é |
@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. |
Cita:
Powercobol 9.0 Código COBOL:
---> returning pAddress ---> pAddress = 0 Gracias |
@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. ;)
|
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 ... |
Cita:
Estoy haciendo esta llamada desde una DLL, ¿solo funciona si la llamo desde un EXE? Gracias |
Hola @Joseg , probe desde una dll y me funciono :mola::mola:
Saludos |
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: |
1 Archivos Adjunto(s)
Cita:
Ok, usaré la primera forma. Llamarlo vía EXE funciona, vía DLL no funciona en absoluto. |
@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:
por Código COBOL:
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.