@fastpho, se me ha ocurrido una manera más elegante de hacerlo.
En "Opened" de tu form pones:
Código COBOL:
WORKING-STORAGE SECTION.
01 imgControl pic s9(9) comp-5 is external.
PROCEDURE DIVISION.
move CmImage1 to imgControl
En "MyWndProc" haces esto:
Código COBOL:
IDENTIFICATION DIVISION.
PROGRAM-ID. "MyWndProc".
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
REPOSITORY.
CLASS COM AS "*COM"
.
DATA DIVISION.
WORKING-STORAGE SECTION.
...
01 imgControl pic s9(9) comp-5 is external.
01 comClass object reference COM.
...
IF MSG = WM_DROPFILES
call "DragQueryFileA" with stdcall using by value WPARAM
by value 0
by reference dropFileName
by reference fileSize
if comClass = null
call "POWERCONVTOCOM" USING imgControl RETURNING comClass
end-if
invoke comClass "set-ImageName" using dropFileName
END-IF
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:
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 wsHwnd pic s9(9) comp-5.
01 ptrMyWndProc procedure-pointer.
01 newWndProc redefines ptrMyWndProc pic s9(9) comp-5.
01 OldWndProc is external pic s9(9) comp-5.
01 GWLP-WNDPROC pic s9(9) comp-5 value -4.
01 imgControl pic s9(9) comp-5 is external.
PROCEDURE DIVISION.
move CmImage1 to imgControl
set ptrMyWndProc to entry "MyWndProc@16"
move "hwnd" of pow-self to wsHwnd
call "GetWindowLongA" with stdcall using by value wsHwnd
by value GWLP-WNDPROC
returning OldWndProc
call "SetWindowLongA" with stdcall using by value wsHwnd
by value GWLP-WNDPROC
by value newWndProc
call "DragAcceptFiles" with stdcall using by value wsHwnd
by value pow-true
"MyWndProc":
Código COBOL:
IDENTIFICATION DIVISION.
PROGRAM-ID. "MyWndProc".
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
REPOSITORY.
CLASS COM AS "*COM"
.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 OldWndProc IS EXTERNAL PIC S9(9) COMP-5.
01 WM_DROPFILES PIC S9(9) COMP-5 VALUE H"0233".
01 P1 POINTER.
01 HWND REDEFINES P1 PIC S9(9) COMP-5.
01 P2 POINTER.
01 MSG REDEFINES P2 PIC 9(9) COMP-5.
01 P3 POINTER.
01 WPARAM REDEFINES P3 PIC S9(9) COMP-5.
01 P4 POINTER.
01 LPARAM REDEFINES P4 PIC S9(9) COMP-5.
01 dropFileName pic x(250).
01 fileSize pic 9(4) comp-5.
01 imgControl pic s9(9) comp-5 is external.
01 comClass object reference COM.
LINKAGE SECTION.
77 PARM1 PIC S9(9) COMP-5.
77 PARM2 PIC 9(9) COMP-5.
77 PARM3 PIC S9(9) COMP-5.
77 PARM4 PIC S9(9) COMP-5.
PROCEDURE DIVISION WITH STDCALL USING PARM1 PARM2 PARM3 PARM4.
MOVE FUNCTION ADDR(PARM1) TO P1
MOVE FUNCTION ADDR(PARM2) TO P2
MOVE FUNCTION ADDR(PARM3) TO P3
MOVE FUNCTION ADDR(PARM4) TO P4
IF MSG = WM_DROPFILES
call "DragQueryFileA" with stdcall using by value WPARAM
by value 0
by reference dropFileName
by reference fileSize
if comClass = null
call "POWERCONVTOCOM" USING imgControl RETURNING comClass
end-if
invoke comClass "set-ImageName" using dropFileName
END-IF
CALL "CallWindowProcA" WITH STDCALL USING BY VALUE OldWndProc
BY VALUE HWND
BY VALUE MSG
BY VALUE WPARAM
BY VALUE LPARAM
GOBACK
.