Cobol Foro
Navegación en el Foro
Retroceder   Cobol Foro Entornos de desarrollo y compiladores Cobol Cocina Casera Cocina PowerCOBOL
Cocina PowerCOBOL Rutinas y ejemplos codificados por nuestros foreros.
 
Respuesta
 
Herramientas

  #1
Antiguo 5 de enero de 2023, 19:06
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207
Idea Subclassing: recibir parámetros BY VALUE
0 Inactivo Inactivo

Sabemos que existen varios modos de pasar parámetros en COBOL:
  • BY VALUE - pasa el valor
  • BY REFERENCE - pasa la dirección del campo para que el llamado pueda modificar datos en él
  • BY CONTENT - similar al anterior pero que es una copia de la variable, así el llamado no puede modificar nada en la variable de origen

Ahora, en C (y lógicamente en WinAPI, escrito en C), hay funciones que reciben parámetros BY VALUE. Por ejemplo una de las funciones más famosas que es WNDPROC:

Código CPP:
  1. LRESULT CALLBACK MainWndProc(
  2.     HWND hwnd,        // handle to window
  3.     UINT uMsg,        // message identifier
  4.     WPARAM wParam,    // first message parameter
  5.     LPARAM lParam)    // second message parameter
  6. {
  7.  
  8.     switch (uMsg)
  9.     {
  10.         case WM_CREATE:
  11.             // Initialize the window.
  12.             return 0;
  13.  
  14.         case WM_PAINT:
  15.             // Paint the window's client area.
  16.             return 0;
  17.  
  18.         case WM_SIZE:
  19.             // Set the size and position of the window.
  20.             return 0;
  21.  
  22.         case WM_DESTROY:
  23.             // Clean up window-specific data objects.
  24.             return 0;
  25.  
  26.         //
  27.         // Process other messages.
  28.         //
  29.  
  30.         default:
  31.             return DefWindowProc(hwnd, uMsg, wParam, lParam);
  32.     }
  33.     return 0;
  34. }

Estos parámetros entran por valor, o sea BY VALUE. Quiere decir que el que llame a esta función, lo que pase como parámetros, en ésta función se recibe tal cual (el valor) y no la dirección en memoria del mismo.
Lo que pasa es que el compilador de Fujitsu dice oficialmente que NO TRABAJA con parámetros BY VALUE en entrada. Esto limita a que no podamos definir funciones que reciban valores BY VALUE en la LINKAGE SECTION, lo cual significa que no podemos hacer subclassing, es decir sobrecargar funciones existentes de WinAPI porque no somos capaces de recibir los parámetros como lo hace C.

Pero lo desmiento totalmente. Hoy he conseguido hacerlo. Y esto quiere decir que podría reescribir toda la WinAPI en Cobol de Fujitsu sin limitación alguna.

Estaba echando un ojo al tema de @Josber: [Información] ToolTipText multilinea
He mirado ejemplos para hacerlo, dicen de utilizar la función WinAPI siguiente: EnumWindows function (winuser.h) - Win32 apps | Microsoft Learn
Esta función necesita pasar como parámetro otra función definida por nosotros, a la que le va a pasar el HWND de toda ventana que encuentre, y lo hará BY VALUE, cosa que el compilador de Fujitsu no soporta (de forma nativa).

Pero le he engañado y lo he hecho funcionar de la siguiente manera:

Creamos un fichero CallBackFunc.cbl (en el directorio, por fuera, en el explorador de Windows) y lo insertamos en el proyecto de PowerCOBOL. En propiedades añadimos la directiva ALPHAL(WORD). El contenido del fichero creado es el siguiente:
Código COBOL:
  1.  IDENTIFICATION DIVISION.
  2.  PROGRAM-ID.     "CallBackFunc".
  3.  ENVIRONMENT     DIVISION.
  4.  DATA            DIVISION.
  5.  WORKING-STORAGE SECTION.
  6.  01  p1           pointer.
  7.  01  w-hwnd redefines p1       pic s9(9) comp-5.
  8.  01  p2           pointer.
  9.  01  w-lParam redefines p2     pic s9(9) comp-5.
  10.  
  11.  LINKAGE SECTION.
  12.  01  hwnd        pic s9(9) comp-5.
  13.  01  lParam      pic s9(9) comp-5.
  14.  PROCEDURE       DIVISION WITH STDCALL LINKAGE using hwnd lParam.
  15.      
  16.      move function addr(hwnd)   to p1
  17.      move function addr(lParam) to p2
  18.      
  19.      display "hwnd  : " w-hwnd
  20.      display "lParam: " w-lParam
  21.      
  22.      goback
  23.      .

Luego en cualquier lado, en mi ejemplo en el evento Click de un botón, le metemos este código:
Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  p-hwnd              PIC S9(9) COMP-5.
  5.  01  c-hwnd              PIC S9(9) COMP-5.
  6.  01  rc                  PIC S9(9) COMP-5.
  7.  
  8.  01  PTR-callBackFnc  procedure-pointer.
  9.  01  cbf redefines PTR-callBackFnc PIC S9(9) COMP-5.
  10.  
  11.  PROCEDURE       DIVISION.
  12.      
  13.      set PTR-callBackFnc to entry "CallBackFunc@8"
  14.      
  15.      move "hwnd" of pow-self to c-hwnd
  16.      
  17.      call "GetParent" with stdcall using by value c-hwnd returning p-hwnd
  18.      
  19.      display "M -> c-hwnd: " c-hwnd "  p-hwnd: " p-hwnd
  20.      
  21.      call "EnumWindows" with stdcall using by value cbf
  22.                                            by value 26
  23.                                      returning rc
  24.                                                
  25.      display "M ->  EnumChildWindows rc: " rc                                          
  26.      

¡Y listo! Tenemos funcionalidad nativa de C/WinAPI con el compilador de Fujitsu!!!

Al ejecutar el programa, se ve el valor 26 que le paso en el evento del botón, lo hago BY VALUE y es correctamente recuperado!



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
Respuesta



Derechos de Publicación
No puedes publicar nuevos temas
No puedes publicar posts/responder
No puedes adjuntar archivos
No puedes editar tus posts

BB code is habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado

Saltar a Foro


La franja horaria es GMT +2. Ahora son las 17:06.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.