Pelles C forum

Assembly language => Assembly discussions => Topic started by: Vortex on November 02, 2025, 10:14:04 AM

Title: Rich Edit sample
Post by: Vortex on November 02, 2025, 10:14:04 AM
Inspired by Timo's work, here is the Rich Edit sample converted to Poasm :

https://forum.pellesc.de/index.php?msg=41554

include DlgBox.inc

.code

start:

    mov     eax,RichEditANSIWndProc
    invoke  GetModuleHandle,0
    invoke  DialogBoxParam,eax,DLG_MAIN,0,ADDR DlgProc,0
    invoke  ExitProcess,eax

DlgProc PROC hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

    .IF uMsg==WM_CLOSE

        invoke  EndDialog,hWnd,0

    .ELSE

        xor     eax,eax
        ret

    .ENDIF

    mov     eax,1
    ret

DlgProc ENDP

END start

Title: Re: Rich Edit sample
Post by: Vortex on November 08, 2025, 09:15:32 AM
Same example built with binary resource template :

include DlgBox.inc

.data

DialogBox:

INCBIN "MyDlg.bin"

.code

start:

    mov     eax,RichEditANSIWndProc
    invoke  GetModuleHandle,0

    xor     ecx,ecx
    invoke  DialogBoxIndirectParam,eax,\
            ADDR DialogBox,ecx,ADDR DlgProc,ecx

    invoke  ExitProcess,eax

DlgProc PROC hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

    .IF uMsg==WM_CLOSE

        invoke  EndDialog,hWnd,0

    .ELSE

        xor     eax,eax
        ret

    .ENDIF

    mov     eax,1
    ret

DlgProc ENDP

END start
Title: Re: Rich Edit sample
Post by: Vortex on November 12, 2025, 08:50:50 PM
Here is the 64-bit version :

include DlgBox.inc

.data

Dlgbox db 'MyDlg',0

.code

start PROC PARMAREA=5*SIZEOF QWORD

LOCAL hModule:QWORD

    mov     rax,RichEditANSIWndProc
    invoke  GetModuleHandle,0
    mov     hModule,rax
    invoke  DialogBoxParam,hModule,ADDR Dlgbox,0,ADDR DlgProc,0
    invoke  ExitProcess,rax

start ENDP

DlgProc PROC hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD PARMAREA=4*SIZEOF QWORD

    .IF uMsg==WM_CLOSE

        invoke  EndDialog,hWnd,0

    .ELSE

        xor    rax,rax
        ret

    .ENDIF

    mov    eax,1
    ret

DlgProc ENDP

END start
Title: Re: Rich Edit sample
Post by: TimoVJL on November 13, 2025, 08:23:01 PM
Useful for users, who needs template for dialog app with richedit control.
Title: Re: Rich Edit sample
Post by: Vortex on November 25, 2025, 09:09:05 PM
Binary resource template version, 64-bit.
Title: Re: Rich Edit sample
Post by: TimoVJL on November 28, 2025, 05:18:37 AM
A dialog without any resource section in one source.
Just a one test material for poasm
;.model flat,fastcall
INCLUDELIB kernel32.lib
INCLUDELIB user32.lib

WM_DESTROY    equ 2
WM_CLOSE      equ 10h
WM_INITDIALOG equ 110h

GetModuleHandleW PROTO :QWORD
ExitProcess PROTO :QWORD
DialogBoxIndirectParamW PROTO :QWORD,:QWORD,:QWORD,:QWORD,:QWORD
EndDialog PROTO :QWORD,:QWORD
PostQuitMessage PROTO :QWORD
MessageBoxW PROTO :QWORD,:QWORD,:QWORD,:QWORD
;----------------------
DlgProc PROTO :QWORD,:DWORD,:QWORD,:QWORD
WMInitdialog PROTO :QWORD
WMDestroy    PROTO
WMClose      PROTO :QWORD

ifdef __POASM__
.drectve segment
db '/subsystem:windows '
.drectve ends
endif

.data
;align 4
DlgBox  dw  1   ; dlgVer
    dw  0FFFF   ; signature
    dd  0       ; helpID
    dd  0       ; exStyle
    dd  10CA0800h   ; style
    dw  0       ; cDlgItems
    dw  0       ; x
    dw  0       ; y
    dw  200     ; cx
    dw  100     ; cy
    dw  0       ; empty menu
    dw  0       ; empty windowClass
    ;dw "Test",0    ; title POAsm
    dw  'T','e','s','t',0   ; title

;sMsg dw  "OK to close",0
sMsg dw  'O','K',' ','t','o',' ','c','l','o','s','e',0

.code
; parameters RCX, RDX, R8 and R9
start PROC  PARMAREA=5*sizeof QWORD
    INVOKE  GetModuleHandleW,0
    mov rcx,rax
    INVOKE  DialogBoxIndirectParamW,rcx,ADDR DlgBox,0,ADDR DlgProc,0
    INVOKE  ExitProcess, rax
start ENDP

DlgProc PROC hWnd:QWORD,uMsg:DWORD,wParam:QWORD,lParam:QWORD PARMAREA=4*sizeof QWORD
    ;mov hWnd, rcx  ; ?
    mov QWORD PTR [rsp+30h],rcx
    ;mov uMsg, rdx
    mov DWORD PTR [rsp+38h],edx
    ;mov wParam, r8
    mov QWORD PTR [rsp+40h],r8
    ;mov lParam, r9
    mov QWORD PTR [rsp+48h],r9
    mov     eax,uMsg
    .if uMsg==WM_INITDIALOG
        INVOKE  WMInitdialog, hWnd
    .elseif uMsg==WM_CLOSE
        INVOKE  WMClose, hWnd
    .elseif uMsg==WM_DESTROY
        INVOKE  WMDestroy 
    .else
@@:     xor     rax,rax
    .endif
    ret
DlgProc ENDP

WMInitdialog PROC hWnd:QWORD PARMAREA=4*sizeof QWORD
    ;mov    hWnd,rcx
    ;mov     qword ptr [rsp+30h],rcx
    mov     rax,1
    ret
WMInitdialog ENDP

WMDestroy PROC
    INVOKE  PostQuitMessage,0
    mov     rax,1
    ret
WMDestroy ENDP

WMClose PROC hWnd:QWORD PARMAREA=4*sizeof QWORD
    ;mov    hWnd,rcx
    mov QWORD PTR [rsp+30h],rcx
    INVOKE  MessageBoxW,hWnd,ADDR sMsg, 0, 21h
    .if rax == 1
        ;mov rcx,hWnd
        mov rcx,QWORD PTR [rsp+30h]
        INVOKE  EndDialog,rcx,0
    .endif
    ret
WMClose ENDP

END start
Title: Re: Rich Edit sample
Post by: Vortex on November 28, 2025, 01:23:04 PM
Hi Timo,

Thanks for your version.