Gracias Rui Pinto (Rapinto)
COBOL Foro
Foro dedicado a COBOL, a la Programación y a la Informática.
Retroceder   COBOL Foro > IDE-s y compiladores COBOL > Fujitsu COBOL > PowerCOBOL y WinAPI
PowerCOBOL y WinAPI Llamadas a la API de Windows en PowerCOBOL
Noticias y Avisos
Respuesta
 
Herramientas

  #1
Antiguo 11 de marzo de 2015, 09:32
IDENTIFICATION DIVISION
Kuk
Administrador
ENVIRONMENT DIVISION
Avatar de Kuk
DATA DIVISION
Forero desde (Registrado)diciembre 2014
España
UbicaciónMadrid
Edad34 años
Última Actividad17.07.2019 15:25
PROCEDURE DIVISION
PostsPosts: 1.398
Ha dicho GraciasEnviado: 304
Ha recibido agradecimientosRecibido: 528
Mejores respuestasSoluiones: 85
ReputaciónReputación: 10
Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road
Exclamation CALLBACK WindowProc

Hola a todos. Ya puse un post sobre este asunto en el otro foro, pero no he logrado desde entonces arreglar el tema.

Estoy intentando crear una funcion COBOL para imitar/sustituit o lo que es lo mismo hacer subclassing de CallWindoProc. Para ello hay que simular algo asi:

Código CPP:
  1. LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  2. {
  3.     switch (message)                  /* handle the messages */
  4.     {
  5.         case WM_CREATE:
  6.             Button1 = CreateWindow("Button", "Child", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
  7.                                    10, 80, 80, 40, hwnd, (HMENU)ID_BUTTON,
  8.                                    hInstance, NULL);
  9.             break;
  10.         case WM_COMMAND:
  11.             if(LOWORD(wParam)==ID_BUTTON)
  12.             {
  13.                 CreateChildWindow(); // В этой функции создается дочернее окно
  14.             }
  15.             break;
  16.  
  17.         case WM_NCACTIVATE:
  18.             wParam = isActive;
  19.             return DefWindowProc (hwnd, message, wParam, lParam);
  20.  
  21.         case WM_DESTROY:
  22.             PostQuitMessage (0);
  23.             break;
  24.         default:
  25.             return DefWindowProc (hwnd, message, wParam, lParam);
  26.     }
  27.     return 0;
  28. }

Lo hago de la siguiente manera:

Código COBOL:
  1. *****************************************
  2.  WORKING-STORAGE SECTION.
  3.  LINKAGE SECTION.
  4.  01  LNK-HWND                   BINARY-LONG.
  5.  01  LNK-MSG                    PIC 9(9) COMP-5.
  6.  01  LNK-WPARAM                 BINARY-LONG.
  7.  01  LNK-LPARAM                 BINARY-LONG.
  8.  
  9.  01  LNK-RESULT                 BINARY-LONG.
  10.  
  11.  PROCEDURE DIVISION WITH STDCALL LINKAGE
  12.  USING LNK-HWND LNK-MSG LNK-WPARAM LNK-LPARAM  
  13.  RETURNING LNK-RESULT.
  14.          
  15.      CALL "CallWindowProcA" WITH STDCALL ...

Pero no recibe los parametros bien y no logro entender por que. A veces recibe los recibe, pero solo 1 campo por cada llamada y no los 4 a la vez, y encima lo hace casi siempre en el primer campo, otras veces no recibe nada...

En teoria llamamos al WinAPI con STDCALL y va bien, o sea que en teoria deberia funcionar bien con WITh stdcall en PROCEDURE pero no se por que no funciona...
A lo mejor alguna opcion de compilacion? He mirado el manual pero no he visto nada que pueda cambiar algo en esto.


NORMAS DEL FORO - obligatorias de conocer para TODOS.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale Pinchando en su Nick:

Kuk no ha iniciado sesión   Responder Con Cita
  #2
Antiguo 11 de marzo de 2015, 22:13
IDENTIFICATION DIVISION
Rapinto
Gran amigo del Foro y Guru de COBOL
ENVIRONMENT DIVISION
Avatar de Rapinto
DATA DIVISION
Forero desde (Registrado)febrero 2015
Portugal
UbicaciónPorto
Última Actividad29.01.2018 19:23
PROCEDURE DIVISION
PostsPosts: 246
Ha dicho GraciasEnviado: 19
Ha recibido agradecimientosRecibido: 215
Mejores respuestasSoluiones: 47
Medallas recibidas: 2Medallas: Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Razón: Por ayudar mucho a los foreros  Guru de los Gurus: Por solidos y amplios conocimientos - Razón: Por saber demasiado! 
ReputaciónReputación: 13
Rapinto is on a distinguished road Rapinto is on a distinguished road Rapinto is on a distinguished road Rapinto is on a distinguished road Rapinto is on a distinguished road Rapinto is on a distinguished road Rapinto is on a distinguished road
Predeterminado

Kuk,

Não entendo muito bem o que pretendes fazer e qual é o erro.
Desculpa lá, o meu espanhol é muito fraco e não consigo entender muito bem.

No entanto, pelo que vejo, tens uma Procedure Division "with STDCALL" - eu nunca utilizei isso.

Nas chamadas a WINAPI aí sim utilizei em muitos casos :

Código COBOL:
  1.       CALL "GetForegroundWindow"  WITH STDCALL LINKAGE
  2.                       RETURNING WS-HANDLE.
  3. *
  4.       CALL "GetWindowLongA" WITH STDCALL USING BY VALUE WS-HANDLE
  5.                                                BY VALUE STYLE
  6.                                 RETURNING      ATTRIBUTE.
  7.       IF ATTRIBUTE = ZERO GO TO MAIN-99.
  8. *
  9.  
  10.      CALL "GetTempPathA" WITH STDCALL LINKAGE USING
  11.                                 BY VALUE WSWINTMPDIRLEN
  12.                                 BY REFERENCE WSWINTMPDIR.
  13. *
  14.      CALL "GetTempFileNameA" WITH STDCALL LINKAGE  USING
  15.                                 BY REFERENCE WSWINTMPDIR
  16.                                 BY REFERENCE WSPREFIX
  17.                                 BY VALUE     WSUNIQUE
  18.                                 BY REFERENCE WSTMPFILENAME
  19.                 RETURNING RESULT.    

Tenta explicar-me melhor, pode ser que eu consiga ajudar,
Reparei que podes ter problemas com o tipo de USING : pode ser por 2 processos: By Reference or By Value.
Isto pode fazer muita diferença.

Un Saludo,
Rui Pinto
Rapinto no ha iniciado sesión   Responder Con Cita
Ha dicho Gracias : 1
Kuk (12 de marzo de 2015)
  #3
Antiguo 12 de marzo de 2015, 08:42
IDENTIFICATION DIVISION
Kuk
Administrador
ENVIRONMENT DIVISION
Avatar de Kuk
DATA DIVISION
Forero desde (Registrado)diciembre 2014
España
UbicaciónMadrid
Edad34 años
Última Actividad17.07.2019 15:25
PROCEDURE DIVISION
PostsPosts: 1.398
Ha dicho GraciasEnviado: 304
Ha recibido agradecimientosRecibido: 528
Mejores respuestasSoluiones: 85
ReputaciónReputación: 10
Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road
Predeterminado

Rapinto, en princpio lo que intento es simular MDI Form en PowerCOBOL.
En realidad, cada Form en PowerCOBOL se compone de:
  • Una WindowForm que es la que contiene SystemMenu, Border etc.
  • Un Frame (Frame de C++, loadable. No hablo de CmFrame), que es en el que realmente ponemos los controles.

Pero a nivel del compilador en modo Diseño, nosotros pensamos que es un Form. Si en en un Form haces GetParent, obtienes el hwnd del ParentForm.

Lo que yo hago para simular MDI, es ChildForm.SetParent = ParentForm.hwnd y asi el ParentForm se hace Container del ChildForm. El problema es que cuando haces click en ChildForm, el ParentForm pierde focus, y vice versa.

Hablé con gente de C++/Delphi + WinAPI. Me dijeron que en este caso hay que hacer subclassing de la ventana. Es decir:
  1. Definir propia procedure equivalente a CallWindowProc y posicionar un PROCEDURE-POINTER MyWndProc.
  2. Obtener PROCEDURE-POINTER de CallWindowProc actual, el que actualmente es llamado por el Window:
  3. En el evendo Window.Opened

Código COBOL:
  1. ******** MyWndProc. Va a ser llamado por Windows, por eso tiene STDCALL
  2.  IDENTIFICATION DIVISION.
  3.  PROGRAM-ID. MyWndProc.
  4.  
  5.  WORKING-STORAGE SECTION.
  6.  01  PTR-OldWndProc IS EXTERNAL PIC S9(9) COMP-5.
  7.  
  8.  LINKAGE SECTION.
  9.  01 LNK-RESULT      PIC S9(9) COMP-5.
  10.  
  11.  01 LNK-HWND        PIC S9(9) COMP-5.
  12.  01 LNK-MSG         PIC S9(9) COMP-5.
  13.  01 LNK-WPARAM      PIC  9(9) COMP-5.
  14.  01 LNK-LPARAM      PIC S9(9) COMP-5.
  15.  
  16.  PROCEDURE DIVISION WITH STDCALL USING LNK-HWND LNK-MSG LNK-WPARAM LNK-LPARAM RETURNING LNK-RESULT.
  17.      
  18.      IF  LNK-MSG = <<LOST FOCUS MESSAGE>> NO ME ACURDO EXACTAMENTE
  19.          MOVE 0 TO LNK-MSG
  20.      END-IF
  21.      
  22.      CALL "CallWindowProc" WITH STDCALL USING BY VALUE PTR-OldWndProc
  23.                                               BY VALUE LNK-HWND
  24.                                               BY VALUE LNK-MSG
  25.                                               BY VALUE LNK-WPARAM
  26.                                               BY VALUE LNK-LPARAM
  27.                                               RETURNING LNK-RESULT.
  28.      
  29.      EXIT PROGRAM.
  30.  END PROGRAM MyWndProc.

Código COBOL:
  1. ******** MainForm.Opened
  2.  WORKING-STORAGE SECTION.
  3.  01  WS-HWND        PIC S9(9) COMP-5.
  4.  01  ParentHWND     PIC S9(9) COMP-5.
  5.  01  PTR-OldWndProc IS EXTERNAL PIC S9(9) COMP-5.
  6.  01  PPTR REDEFINES PTR-OldWndProc PROCEDURE-POINTER.
  7.  01  PTR-MyWndProc  PROCEDURE-POINTER.
  8.  
  9.  PROCEDURE DIVISION.
  10.      
  11.      MOVE "hwnd" OF POW-SELF TO WS-HWND
  12.          
  13.      CALL "GetParent" WITH STDCALL USING BY VALUE LNK-HWND
  14.                                          RETURNING ParentHWND.
  15.      
  16.      CALL "GetWindowLong" WITH STDCALL USING BY VALUE ParentHWND
  17.                                              BY VALUE GWL_WNDPROC
  18.                                              RETURNING PPTR.
  19.      
  20.      SET PTR-MyWndProc TO ENTRY "MyWndProc"
  21.      
  22.      CALL "SetWindowLong" WITH STDCALL USING BY VALUE ParentHWND
  23.                                              BY VALUE GWL_WNDPROC
  24.                                              BY VALUE PTR-MyWndProc
  25.                                              RETURNING PPTR.

Rui, el codigo no es exacto, lo acabo de escribir de memoria (estoy en el trabajo). Pero entenderas lo que hago. Es sustiuir CallWindoProc por MyWndProc, camptar WindowMessage, si es desactivar Focus visual, muevo 0, y llamo default CallWindoProc con PTR-OldWndProc.

A ver que opians.


NORMAS DEL FORO - obligatorias de conocer para TODOS.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale Pinchando en su Nick:

Kuk no ha iniciado sesión   Responder Con Cita
  #4
Antiguo 12 de marzo de 2015, 22:53
IDENTIFICATION DIVISION
Rapinto
Gran amigo del Foro y Guru de COBOL
ENVIRONMENT DIVISION
Avatar de Rapinto
DATA DIVISION
Forero desde (Registrado)febrero 2015
Portugal
UbicaciónPorto
Última Actividad29.01.2018 19:23
PROCEDURE DIVISION
PostsPosts: 246
Ha dicho GraciasEnviado: 19
Ha recibido agradecimientosRecibido: 215
Mejores respuestasSoluiones: 47
Medallas recibidas: 2Medallas: Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Razón: Por ayudar mucho a los foreros  Guru de los Gurus: Por solidos y amplios conocimientos - Razón: Por saber demasiado! 
ReputaciónReputación: 13
Rapinto is on a distinguished road Rapinto is on a distinguished road Rapinto is on a distinguished road Rapinto is on a distinguished road Rapinto is on a distinguished road Rapinto is on a distinguished road Rapinto is on a distinguished road
Predeterminado

Kuk,

Estive a analisar melhor e encontrei este texto:

AllAPI.net - Your #1 source for using API-functions in Visual Basic!

que explica Subclassing muito bem. (Tem exemplo a funcionar bem com a source em VB6).
Segundo este texto, o que estás a fazer parece-me numa primeira analise correto.

Mas vou continuar a ver melhor.
Se descobrires mais alguma coisa diz-me.
Saludos,
Rui
Rapinto no ha iniciado sesión   Responder Con Cita
Ha dicho Gracias : 1
Kuk (13 de marzo de 2015)
  #5
Antiguo 13 de marzo de 2015, 08:17
IDENTIFICATION DIVISION
Kuk
Administrador
ENVIRONMENT DIVISION
Avatar de Kuk
DATA DIVISION
Forero desde (Registrado)diciembre 2014
España
UbicaciónMadrid
Edad34 años
Última Actividad17.07.2019 15:25
PROCEDURE DIVISION
PostsPosts: 1.398
Ha dicho GraciasEnviado: 304
Ha recibido agradecimientosRecibido: 528
Mejores respuestasSoluiones: 85
ReputaciónReputación: 10
Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road
Predeterminado

Rapinto, ando un poco mal de tiempo, pero lo que he pensafo de probar es en modo OO COBOL. Es decir, crear aplicacion con la opcion 2. Ahi a lo mejor funciona...

Lo que no entiendo es que si llamamos API-s con STDCALL bien, significa que la CALL-CONVENTION es correcta para WinAPI. Pero (!!!), al ser llamada MyWndProc, recibe parametros pero no todos, y en campos diferentes. Lo que he podido detectar ha sido que a veces (no siempre), es como si por cada campo hay 1 llamada. Es decir:
  1. Call MyWndProc USING hWnd
  2. Call MyWndProc USING Message
  3. Call MyWndProc USING wParam
  4. Call MyWndProc USING lParam

En lugar de llamarse 1 vez con los 4:
  • Call MyWndProc USING hWnd, Message, wParam, lParam

Lo que a mi me dice que:
  1. Sea la CALL-CONVENTION no es realmente la adecuada (pero es menos probable)
  2. Sea que CALLBACK no funciona en procedres COBOL, al menos en modo "1 - COBOL85". Por eso quiero probar con modo "2 - OO COBOL"

Añadido despues de 13 horas 38 minutos
Rui, he encontrado esto en el NetCOBWinUsersGuide.pdf:

NOTES:
When calling COBOL programs from COBOL programs, you cannot pass parameters
with “USING BY VALUE.”
El problema no es CALL-CONVENTION. El problema es BY VALUE. En cualquier WITH, sea C, STDCALL o COBOL (sin nada), si pasas valor BY VALUE - el programa se cierra con error...


NORMAS DEL FORO - obligatorias de conocer para TODOS.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale Pinchando en su Nick:


Última edición por Kuk fecha: 13 de marzo de 2015 a las 21:56. Razón: Post añadido
Kuk no ha iniciado sesión   Responder Con Cita
  #6
Antiguo 27 de marzo de 2015, 19:37
IDENTIFICATION DIVISION
Kuk
Administrador
ENVIRONMENT DIVISION
Avatar de Kuk
DATA DIVISION
Forero desde (Registrado)diciembre 2014
España
UbicaciónMadrid
Edad34 años
Última Actividad17.07.2019 15:25
PROCEDURE DIVISION
PostsPosts: 1.398
Ha dicho GraciasEnviado: 304
Ha recibido agradecimientosRecibido: 528
Mejores respuestasSoluiones: 85
ReputaciónReputación: 10
Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road
Predeterminado

Al final he hecho una DLL en C++ a la cual paso el OldWndProc y en la cual he definido MyWndProc.

Funciona 100%! Asi que he podido simular MDI MainForm en PowerCOBOL!


NORMAS DEL FORO - obligatorias de conocer para TODOS.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale Pinchando en su Nick:

Kuk no ha iniciado sesión   Responder Con Cita
  #7
Antiguo 25 de agosto de 2015, 07:48
IDENTIFICATION DIVISION
Eslopes
Guru de OO COBOL
ENVIRONMENT DIVISION
Avatar de Eslopes
DATA DIVISION
Forero desde (Registrado)agosto 2015
Brasil
Última Actividad11.05.2019 20:19
PROCEDURE DIVISION
PostsPosts: 66
Ha dicho GraciasEnviado: 17
Ha recibido agradecimientosRecibido: 29
Mejores respuestasSoluiones: 2
ReputaciónReputación: 6
Eslopes is on a distinguished road Eslopes is on a distinguished road Eslopes is on a distinguished road
Predeterminado

Olá,

fiquei curioso para ver como fica uma aplicação Powercobol MDI. Poderia compartilhar um screenshot?

Saludos, Emerson
Eslopes no ha iniciado sesión   Responder Con Cita
  #8
Antiguo 25 de agosto de 2015, 18:34
IDENTIFICATION DIVISION
Kuk
Administrador
ENVIRONMENT DIVISION
Avatar de Kuk
DATA DIVISION
Forero desde (Registrado)diciembre 2014
España
UbicaciónMadrid
Edad34 años
Última Actividad17.07.2019 15:25
PROCEDURE DIVISION
PostsPosts: 1.398
Ha dicho GraciasEnviado: 304
Ha recibido agradecimientosRecibido: 528
Mejores respuestasSoluiones: 85
ReputaciónReputación: 10
Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road
Predeterminado

eslopes, aquí lo tienes

Pero ojo, no es MDI realmente, es sólo una simulación. Lo que se hace es que la ventana "MDI" no pierda foco visualmente. Como verás en los marcos amarillos, visualmente los 2 ControlBox están activos.
Imágenes Adjuntas
Tipo de Archivo: png PowerMDI.png (57,8 KB, 31 descargas)


NORMAS DEL FORO - obligatorias de conocer para TODOS.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale Pinchando en su Nick:

Kuk no ha iniciado sesión   Responder Con Cita
  #9
Antiguo 26 de agosto de 2015, 00:34
IDENTIFICATION DIVISION
Eslopes
Guru de OO COBOL
ENVIRONMENT DIVISION
Avatar de Eslopes
DATA DIVISION
Forero desde (Registrado)agosto 2015
Brasil
Última Actividad11.05.2019 20:19
PROCEDURE DIVISION
PostsPosts: 66
Ha dicho GraciasEnviado: 17
Ha recibido agradecimientosRecibido: 29
Mejores respuestasSoluiones: 2
ReputaciónReputación: 6
Eslopes is on a distinguished road Eslopes is on a distinguished road Eslopes is on a distinguished road
Predeterminado

Gracias pelo screenshot.

Entendo que seja uma simulação, pero me parece que a janela CfForm1 não pode ultrapassar os limites da janela principal, certo ?
Eslopes no ha iniciado sesión   Responder Con Cita
  #10
Antiguo 26 de agosto de 2015, 08:13
IDENTIFICATION DIVISION
Kuk
Administrador
ENVIRONMENT DIVISION
Avatar de Kuk
DATA DIVISION
Forero desde (Registrado)diciembre 2014
España
UbicaciónMadrid
Edad34 años
Última Actividad17.07.2019 15:25
PROCEDURE DIVISION
PostsPosts: 1.398
Ha dicho GraciasEnviado: 304
Ha recibido agradecimientosRecibido: 528
Mejores respuestasSoluiones: 85
ReputaciónReputación: 10
Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road
Predeterminado

eslopes, claro, de eso se trata. La ventana principal se hace Parent de las ventanas Child. Si muevo la ventana Principal, se mueven todas las ventanas.


NORMAS DEL FORO - obligatorias de conocer para TODOS.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale Pinchando en su Nick:

Kuk no ha iniciado sesión   Responder Con Cita
Ha dicho Gracias : 1
eslopes (26 de agosto de 2015)
Respuesta

Tags
callback , mdi , wndproc


Usuarios activos actualmente viendo este tema: 1 (0 miembros y 1 visitantes)
 
Herramientas

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



La franja horaria es GMT +1. Ahora son las 15:44.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2019, Jelsoft Enterprises Ltd.