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)

fastpho 11 de noviembre de 2024 21:35

1 Archivos Adjunto(s)
@Kuk , en el .EXE deje "EnumWindowsProc" y en la .DLL
solamente me ti y funciono
Código COBOL:
  1.     move pow-numeric of CmText1 to pid.
  2.      
  3.          
  4.      call "GetModuleHandleA" with stdcall using by value 0 returning hModule
  5.          
  6.      call "GetProcAddress" with stdcall using by value hModule
  7.                                               by content "_EnumWindowsProc@8" & X"00"
  8.                                               returning pAddress
  9.                                               display "pAddress: " , pAddress.
  10.      
  11.      call "EnumWindows" with stdcall using by value pAddress
  12.                                            by value pid
Pero viendo el error de @Joseg le inserte el "EnumWindowsProc" a la .DLL y seguia funcionando
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]

fastpho 11 de noviembre de 2024 23:25

@Kuk, efectivamente para usar una .DLL , y colocar el EnumWindowsProc en ella , se debe llamar pasandole un valor por contenido
Código COBOL:
  1.      MOVE "SFAC03.DLL" & x"00" TO  String-DLL.
  2.          
  3. *    call "GetModuleHandleA" with stdcall using by value 0 returning hModule
  4.       call "GetModuleHandleA" with stdcall using by CONTENT String-DLL  returning hModule
  5.      DISPLAY "hModule: " , hModule.  
Funciona correctamente
Gracias
Saludos ...

Joseg 12 de noviembre de 2024 12:31

Cita:

Citación del post de Kuk (Mensaje 9635)
@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.

Ahora si!!! Dominas completamente este tema!!!
También estudiaré un poco sobre el tema. El uso de la API de Windows puede ayudar en muchos escenarios.

Gracias

Kuk 12 de noviembre de 2024 14:54

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

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