![]() |
Processo/EXE ativo
Olá
Como saber en Powercobol se um processo esta ativo? Gracias Jose |
Hola @Joseg , si estas buscando saber si una appxxx.exe esta ejecutandose dos formas :
una con el control ocx ScriptControl Código COBOL:
Otra forma es buscando la ventana del appxxx.exe con api de windows : GetTopWindow , GetWindow , GetWindowTextA Código COBOL:
Saludos ... |
@Joseg,
Código COBOL:
|
Muchas gracias a todos por vuestra ayuda. :amigo:
Eu pretendia fazer isto: https://www.tek-tips.com/threads/set...g-pid.1820890/ Apenas consegui fazer em "C" e Windev. Em anexo o código em "C". Pero la idea era la siguiente: Con el número PID y no el título de la ventana (el título es dinámico), maximizar un programa de terceros y hacerse visible. Código CPP:
|
@Joseg, desde que descubrí cómo hacer funcionar el CALL BY VALUE en PowerCOBOL, absolutamente todo lo que se puede hacer en C, también se puede hacer en PowerCOBOL!
Así que, este código C también se puede convertir en PowerCOBOL! ;) |
Cita:
Por ejemplo, esta función "&& IsWindowVisible(hwnd))" no devolvió el resultado correcto. Debo estar haciendo algo mal. Código COBOL:
|
@Joseg, acabo de probarlo y funciona:
Lo primero, creas un fichero nuevo en el directrio del proyecto y lo llamas EnumWindowsProc. Luego lo añades en el proyecto (import) y le pegas el siguiente contenido: Código COBOL:
No olvides de añadirle la directiva ALPHAL(WORD) en las propiedades. Luego desde donde quieras haces algo así (yo lo hago en el evento Click de un botón, recogiendo un PID desde CmText): Código COBOL:
Ya nos cuentas qué tal ;) |
Perfecto :amigo:. Kuk entiendes mucho de esto !!
Gracias. José |
@Joseg, de nada, para eso estamos :beber:
El problema era que oficialmente Fujitsu COBOL no trabaja con BY VALUE, pero de esta manera "hackeamos" el compilador quitándole este handicap y hacemos funcionar los CALL BY VALUE. Y con esta solución podemos reescribir el Windows por completo si queremos :rofl: |
@Joseg, he encontrado otra manera de hacerlo funcionar sin pasar por PROCEDURE-POINTER, lo cual me hace suponer que funcionaría incluso en PowerCOBOL v3 (que no tiene PROCEDURE-POINTER):
Código COBOL:
Funciona perfectamente, lo que pasa es que aquí uso WinAPI para obtener la dirección de la función. A ver si un día lo pruebo en PowerCOBOL v3, debería funcionar, salvo que haya algún imprevisto. |
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. |
1 Archivos Adjunto(s)
@Kuk , en el .EXE deje "EnumWindowsProc" y en la .DLL
solamente me ti y funciono Código COBOL:
Luego quite del .EXE y el EnumWindows y lo deje en la .DLL y efectivamente no funciono Espero a ver sido claro Saludos[ATTACH=CONFIG]1009[/ATTACH] |
@Kuk, efectivamente para usar una .DLL , y colocar el EnumWindowsProc en ella , se debe llamar pasandole un valor por contenido
Código COBOL:
Gracias Saludos ... |
Cita:
También estudiaré un poco sobre el tema. El uso de la API de Windows puede ayudar en muchos escenarios. Gracias |
@Joseg, no es que me lo sepa todo de memoria, ni falta que hace. Como decía, el problema era que el compilador de Fujitsu no funciona BY VLUE. Pero engañándolo como lo hacemos, sí que funciona. Y en tal caso podemos hacer cualquier cosa, todo lo que se hace en C se puede hacer en PowerCOBOL. El resto es ver la documentación ;)
|
| La franja horaria es GMT +2. Ahora son las 02:41. |
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.