PDA

Ver la Versión Completa : [Sintaxis] Obtener la dirección de una función PowerCOBOL


Kuk
5 de noviembre de 2015, 11:15
Amigos, no encuentro ningún modo de obtener la dirección de una función para pasarla por un POINTER.

En los manuales de PowerCOBOL 3, viene PROCEDURE-POINTER como palabra reservada, pero no compila con ello. Pero ese problema lo tengo resuelto simplemente definiendo el puntero como POINTER y pasándolo a las funciones de WinAPI funciona perfectamente (en realidad viene a ser el mismo DWORD de 4 bytes).

En PowerCOBOL 9 existe un modo de hacerlo con la sintaxis adaptada de MicroFocus:


WORKING-STORAGE SECTION.
01 WS-PTR PROCEDURE-POINTER.
PROCEDURE DIVISION.

SET WS-PTR TO ENTRY "MiPrograma"



Pero esta sintaxis no funciona en PowerCOBOL 3...
Para poder usar la API GetProcAddress la función debe estar en una DLL y definida como exportada (dllexport). Pero esto no me sirve, al menos, incluso si es posible, me complicaría muchísimo las cosas.

¿Alguna idea de cómo podría obtener esa dirección de una función codificada en la "PROCEDURE" de un SHEET? Es que con todas las posibilidades que tiene el Power 3, debe haber un modo de hacerlo.

Rapinto
6 de noviembre de 2015, 00:50
KUK,

Não sei se percebi bem o que pretendes (eu não uso o Power 3).

Será que utilizando o "depends.exe" da Microsoft, conseguirias saber o address??
Envio em anexo o exe.

Un Saludo,
Rui Pinto

Kuk
6 de noviembre de 2015, 10:12
Rapinto, el Depends obtiene las funciones exportadas, las "public" por decirlo de alguna forma. Esas funciones exportadas sólo pueden estar en una DLL, y ser llamadas desde otras aplicaciones (sea DLL o EXE). En este caso hablamos de una funcion interna, que no es visible desde fuera, además en un EXE no se puede exportar funciones porque no son librerías dinámicas...

Kuk
22 de febrero de 2016, 11:21
He intentado de todas las menaras posibles, y he llegado a la conclusión de que simplemente el compilador no acepta PROCEDURE-POINTER. Por lo pronto, declarando un campo como tal ni si quiera compila... Y luego, realmente lo que hace en PowerCOBOL posteriores con la sentencia siguiente:


WORKING-STORAGE SECTION.
01 PPTR PROCEDURE-POINTER

PROCEDURE DIVISION.

SET PPTR TO ENTRY "MyEntry"


Es simplemente reemplazar PPTR por la dirección de la función, que es calculada justamente a la hora de compilar/linkear (el offset).

Con lo cual, es una pena, pero no se puede hacer nada con PROCEDURE-POINTER...

Dasije
11 de octubre de 2018, 18:16
La única manera de obtener el puntero de una función es usando la API de Windows, en Windev por ejemplo lo hago así y funciona, hay que obtener primero el handle de la DLL cuando se carga en memoria.

handle_DLL is system int = LoadDLL(archivo_DLL)

IF handle_DLL = 0 THEN
RESULT False
ELSE
puntero_API is system int = API("KERNEL32","GetProcAddress",handle_DLL,funcion)
FreeDLL(handle_DLL)
RESULT puntero_API
END

Kuk
11 de octubre de 2018, 21:06
Dasije, esto funciona con una DLL pero no con un EXE porque el último normalmente no exporta ninguna función secundaria.