Ver Mensaje Individual
  #22
Antiguo 15 de noviembre de 2024, 09:31
Kuk
Administrador
Última Actividad 03.10.2026 00:00
Posts Posts: 2.500
Likes enviados Enviados: 1038
Likes recibidos Recibidos: 1207

@fastpho, se me ha ocurrido una manera más elegante de hacerlo.

En "Opened" de tu form pones:
Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01  imgControl     pic s9(9) comp-5 is external.
  3.  PROCEDURE       DIVISION.
  4.  
  5.      move CmImage1 to imgControl
  6.    

En "MyWndProc" haces esto:

Código COBOL:
  1.  IDENTIFICATION DIVISION.
  2.  PROGRAM-ID. "MyWndProc".
  3.  ENVIRONMENT DIVISION.
  4.  CONFIGURATION   SECTION.
  5.  SPECIAL-NAMES.
  6.  REPOSITORY.
  7.      CLASS COM AS "*COM"
  8.      .
  9.  DATA DIVISION.
  10.  WORKING-STORAGE SECTION.  
  11. ...
  12.  01  imgControl     pic s9(9) comp-5 is external.
  13.  01  comClass      object reference COM.
  14. ...
  15.  
  16.      IF  MSG = WM_DROPFILES        
  17.          call "DragQueryFileA" with stdcall using by value WPARAM
  18.                                                   by value 0
  19.                                                   by reference dropFileName
  20.                                                   by reference fileSize
  21.          
  22.          if  comClass = null
  23.              call "POWERCONVTOCOM" USING imgControl RETURNING comClass
  24.          end-if
  25.          
  26.          invoke comClass "set-ImageName" using dropFileName
  27.      END-IF
  28.          

A ver qué tal, a mi me funciona. Y el código me gusta más, porque el CALL a "XPOW-..." es un poco chapuza.

[HR][/HR]
El ejemplo limpio queda así:

"Opened" del form:
Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  wsHwnd         pic s9(9) comp-5.
  5.  01  ptrMyWndProc   procedure-pointer.
  6.  01  newWndProc redefines ptrMyWndProc pic s9(9) comp-5.
  7.  
  8.  01  OldWndProc     is external pic s9(9) comp-5.
  9.  
  10.  01  GWLP-WNDPROC   pic s9(9) comp-5 value -4.
  11.  
  12.  01  imgControl     pic s9(9) comp-5 is external.
  13.  PROCEDURE       DIVISION.
  14.  
  15.      move CmImage1 to imgControl
  16.          
  17.      set ptrMyWndProc to entry "MyWndProc@16"
  18.      
  19.      move "hwnd" of pow-self to wsHwnd
  20.      
  21.      call "GetWindowLongA" with stdcall using by value wsHwnd
  22.                                               by value GWLP-WNDPROC
  23.                                               returning OldWndProc
  24.                                              
  25.      call "SetWindowLongA" with stdcall using by value wsHwnd
  26.                                               by value GWLP-WNDPROC
  27.                                               by value newWndProc
  28.  
  29.      call "DragAcceptFiles" with stdcall using by value wsHwnd
  30.                                                by value pow-true
  31.                                                
  32.      

"MyWndProc":
Código COBOL:
  1.  IDENTIFICATION DIVISION.
  2.  PROGRAM-ID. "MyWndProc".
  3.  ENVIRONMENT DIVISION.
  4.  CONFIGURATION   SECTION.
  5.  SPECIAL-NAMES.
  6.  REPOSITORY.
  7.      CLASS COM AS "*COM"
  8.      .
  9.  DATA DIVISION.
  10.  WORKING-STORAGE SECTION.  
  11.  01  OldWndProc     IS  EXTERNAL PIC S9(9) COMP-5.
  12.  
  13.  
  14.  01  WM_DROPFILES   PIC  S9(9) COMP-5 VALUE H"0233".  
  15.  
  16.  01  P1                   POINTER.
  17.  01  HWND REDEFINES P1    PIC S9(9) COMP-5.
  18.  01  P2                   POINTER.
  19.  01  MSG  REDEFINES P2    PIC  9(9) COMP-5.
  20.  01  P3                   POINTER.
  21.  01  WPARAM REDEFINES P3  PIC S9(9) COMP-5.
  22.  01  P4                   POINTER.
  23.  01  LPARAM REDEFINES P4  PIC S9(9) COMP-5.
  24.  
  25.  01  dropFileName         pic x(250).
  26.  01  fileSize             pic 9(4) comp-5.
  27.  
  28.  01  imgControl     pic s9(9) comp-5 is external.
  29.  01  comClass       object reference COM.
  30.  
  31.  LINKAGE SECTION.
  32.  77  PARM1                PIC S9(9) COMP-5.
  33.  77  PARM2                PIC  9(9) COMP-5.
  34.  77  PARM3                PIC S9(9) COMP-5.
  35.  77  PARM4                PIC S9(9) COMP-5.
  36.  
  37.  PROCEDURE DIVISION WITH STDCALL USING PARM1 PARM2 PARM3 PARM4.
  38.      
  39.      MOVE FUNCTION ADDR(PARM1) TO P1
  40.      MOVE FUNCTION ADDR(PARM2) TO P2
  41.      MOVE FUNCTION ADDR(PARM3) TO P3
  42.      MOVE FUNCTION ADDR(PARM4) TO P4
  43.      
  44.      IF  MSG = WM_DROPFILES        
  45.          call "DragQueryFileA" with stdcall using by value WPARAM
  46.                                                   by value 0
  47.                                                   by reference dropFileName
  48.                                                   by reference fileSize
  49.          
  50.          
  51.          if  comClass = null            
  52.              call "POWERCONVTOCOM" USING imgControl RETURNING comClass
  53.          end-if
  54.          
  55.          invoke comClass "set-ImageName" using dropFileName
  56.      END-IF
  57.          
  58.      CALL "CallWindowProcA" WITH STDCALL USING BY VALUE OldWndProc
  59.                                                BY VALUE HWND
  60.                                                BY VALUE MSG
  61.                                                BY VALUE WPARAM
  62.                                                BY VALUE LPARAM  
  63.      
  64.      GOBACK
  65.      .
  66.      



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