; Turbo Assembler Copyright (c) 1988, 1991 By Borland International, Inc. ; WINPROG.ASM - Template for writing windows programs ; From the Turbo Assembler Users Guide MULTIPLE_INST = 0 ;set to 1 to allow multiple instances of ; the program, 0 otherwise. LOCALS .MODEL LARGE, WINDOWS PASCAL .286 INCLUDE WINDOWS.INC INCLUDE WINPROG.ASH extrn INITTASK:PROC extrn WAITEVENT:PROC extrn INITAPP:PROC extrn REGISTERCLASS:PROC extrn MESSAGEBOX:PROC extrn GETSTOCKOBJECT:PROC extrn LOADCURSOR:PROC extrn CREATEWINDOW:PROC extrn SHOWWINDOW:PROC extrn UPDATEWINDOW:PROC extrn GETMESSAGE:PROC extrn TRANSLATEMESSAGE:PROC extrn DISPATCHMESSAGE:PROC extrn POSTQUITMESSAGE:PROC extrn DEFWINDOWPROC:PROC extrn BEGINPAINT:PROC extrn ENDPAINT:PROC extrn INVALIDATERECT:PROC extrn TEXTOUT:PROC extrn LOADSTRING:PROC extrn LOADICON:PROC ;Our DLL function extrn PASCAL SETHELLO:FAR ;DLL function in DLLPROG.ASM .DATA db 16 dup( 0 ) ; Required for Task Header!! psp dw ? pszCmdline dw ? hPrev dw ? hInstance dw ? nCmdShow dw ? hdc dw ? hwndMain dw 0 ps PAINTSTRUCT <0> msg MSGSTRUCT <0> wc WNDCLASS <0> szTitleName db 'Sample Windows App',0 szClassName db "$un$Peu$d'Assemblage$",0 szDllText db 80 dup (0) szRcText db 40 dup (0) szLButtonDown db 'Left Button down',0 szInfo db 'Info',0 szWinprog db 'WinProg',0 .CODE ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=; InitApplication PROC ;; initialize the WndClass structure mov wc.clsStyle, CS_HREDRAW+CS_VREDRAW mov word ptr wc.clsLpfnWndProc, OFFSET WndProc mov word ptr wc.clsLpfnWndProc+2, SEG WndProc mov wc.clsCbClsExtra, 0 mov wc.clsCbWndExtra, 0 mov ax, hInstance mov wc.clsHInstance, ax push ax call LoadIcon PASCAL, ax, DS, OFFSET szWinProg mov wc.clsHIcon, ax pop ax call GetStockObject PASCAL, WHITE_BRUSH mov wc.clsHbrBackground, ax mov word ptr wc.clsLpszMenuName, 0 mov word ptr wc.clsLpszMenuName+2, 0 mov word ptr wc.clsLpszClassName, OFFSET szClassName mov word ptr wc.clsLpszClassName+2, ds call RegisterClass PASCAL, DS, OFFSET wc ret ENDP ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=; Start: ;Windows initialization. Sets up registers and stack. ;INITTASK returns: ; 'Failure: ; AX = zero if it failed ; Success: ; AX = 1 ; CX = stack limit ; DX = cmdShow parameter to CreateWindow ; ES:BX = -> DOS format command line (ES = PSP address) ; SI = hPrevinstance ; DI = hinstance call INITTASK or ax,ax jnz @@OK jmp @@Fail @@OK: mov psp, es mov word ptr pszCmdline, bx mov hPrev, si mov hInstance, di mov nCmdShow, dx ;Initialize the Windows App xor ax,ax call WAITEVENT PASCAL, ax call INITAPP PASCAL, hInstance or ax,ax jnz @@InitOK @@Fail: mov ax, 4CFFh int 21h ; terminate program @@InitOK: cmp hPrev, 0 jne @@RegOK call InitApplication or ax, ax jz @@Fail @@RegOK: xor ax, ax mov bx, CW_USEDEFAULT call CreateWindow PASCAL, DS OFFSET szClassName, DS,\ OFFSET szTitleName, \ WS_OVERLAPPEDWINDOW+WS_VISIBLE, ax, \ bx, bx, bx, bx, ax, ax, hInstance, ax, ax mov hwndMain, ax call ShowWindow PASCAL, ax, nCmdShow call UpdateWindow PASCAL, hwndMain @@MsgLoop: call GetMessage PASCAL, DS, OFFSET msg, 0, 0, 0 or ax, ax jz @@End call TranslateMessage PASCAL, DS, OFFSET msg call DispatchMessage PASCAL, DS, OFFSET msg jmp @@MsgLoop @@End: mov ax, msg.msWPARAM mov ah, 4Ch int 21h ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=; .DATA MSGINFO STRUC MsgValue dw 0 MsgHandler dw 0 MSGINFO ENDS .CODE ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=; PaintHandler PROC PASCAL NEAR hwnd:WORD, wParam:WORD, lParam:DWORD call BeginPaint PASCAL, hwnd, DS, OFFSET ps mov hdc, ax mov bx, 10 ;; get a string from the DLLPROG.DLL call SETHELLO PASCAL,DS OFFSET szDllText mov cx,ax ;; length of string is returned in ax call TextOut PASCAL, hdc, bx, bx, DS, OFFSET szDllText, cx call EndPaint PASCAL, hwnd, DS, OFFSET ps ret ENDP ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=; LButtonDownHandler PROC PASCAL NEAR hwnd:WORD, wParam:WORD, lParam:DWORD call MessageBox PASCAL, hwnd, DS, OFFSET szLButtonDown, \ DS, OFFSET szInfo, MB_OK ret ENDP ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=; DestroyHandler PROC PASCAL NEAR hwnd:WORD, wParam:WORD, lParam:DWORD call PostQuitMessage PASCAL, 0 ret ENDP .DATA ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=; MessageTableHandler LABEL MSGINFO MSGINFO MSGINFO MSGINFO MSGINFO <0,0> ;Flags end of table .CODE ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=; WndProc PROC WINDOWS PASCAL FAR hwnd:WORD, winMsg:WORD, \ wParam:WORD, lParam:DWORD USES si mov si, OFFSET MessageTableHandler @@LookUp: mov ax, [si.MsgValue] or ax, ax jz @@Def cmp ax, winMsg je @@Dispatch add si, SIZE MsgInfo jmp @@LookUp @@Dispatch: call [si.MsgHandler] PASCAL, hwnd, wParam, lParam mov ax, 0 mov dx, 0 ret @@Def: call DefWindowProc PASCAL, hwnd, winMsg, wParam, lParam ret WndProc ENDP PUBLICDLL WndProc END Start