News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

Problem with create and writefile

Started by ciapek, April 12, 2010, 08:59:07 PM

Previous topic - Next topic

ciapek

Hello everyone!
I have a problem with my program. Program should load txt file and after that save it on the HDD. Unfortunately, it doesn't work, and I don't know why. I write in MASM32 and use prostart (second button will be necessary later):
; ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

      .386                      ; create 32 bit code
      .model flat, stdcall      ; 32 bit memory model
      option casemap :none      ; case sensitive

      include szyfrowanie.inc        ; local includes for this file     
     
.DATA
input db "odszyfrowany.txt" 
output db "zaszyfrowany.txt"
filter       db "Pliki tekstowe (*.txt)", 0, "*.txt", 0, 0 
fileName     db 255 DUP(0)
default      db "txt", 0
ofn          OPENFILENAME<>


.DATA?
file         HANDLE ?
memory       HANDLE ?
size         DWORD ?
pointer      DWORD ?
filledMemory DWORD ?

.code

start:

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

      invoke InitCommonControls

    ; ------------------
    ; set global values
    ; ------------------
      mov hInstance,   rv(GetModuleHandle, NULL)
      mov CommandLine, rv(GetCommandLine)
      mov hIcon,       rv(LoadIcon,hInstance,500)
      mov hCursor,     rv(LoadCursor,NULL,IDC_ARROW)
      mov sWid,        rv(GetSystemMetrics,SM_CXSCREEN)
      mov sHgt,        rv(GetSystemMetrics,SM_CYSCREEN)

      call Main

      invoke ExitProcess,eax

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

Main proc

    LOCAL Wwd:DWORD,Wht:DWORD,Wtx:DWORD,Wty:DWORD

    STRING szClassName,"ProStart_Class"

  ; --------------------------------------------
  ; register class name for CreateWindowEx call
  ; --------------------------------------------
    invoke RegisterWinClass,ADDR WndProc,ADDR szClassName,
                       hIcon,hCursor,COLOR_BTNFACE+1

    mov Wwd, 138
    mov Wht, 80
    invoke TopXY,Wwd,sWid
    mov Wtx, eax
    invoke TopXY,Wht,sHgt
    mov Wty, eax

    invoke CreateWindowEx,WS_EX_LEFT,
                          ADDR szClassName,
                          ADDR szDisplayName,
                          WS_OVERLAPPEDWINDOW,
                          Wtx,Wty,Wwd,Wht,
                          NULL,NULL,
                          hInstance,NULL
    mov hWnd,eax

  ; ---------------------------
  ; macros for unchanging code
  ; ---------------------------
    DisplayWindow hWnd,SW_SHOWNORMAL

    call MsgLoop
    ret

Main endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

RegisterWinClass proc lpWndProc:DWORD, lpClassName:DWORD,
                      Icon:DWORD, Cursor:DWORD, bColor:DWORD

    LOCAL wc:WNDCLASSEX

    mov wc.cbSize,         sizeof WNDCLASSEX
    mov wc.style,          CS_BYTEALIGNCLIENT or \
                           CS_BYTEALIGNWINDOW
    m2m wc.lpfnWndProc,    lpWndProc
    mov wc.cbClsExtra,     NULL
    mov wc.cbWndExtra,     NULL
    m2m wc.hInstance,      hInstance
    m2m wc.hbrBackground,  bColor
    mov wc.lpszMenuName,   NULL
    m2m wc.lpszClassName,  lpClassName
    m2m wc.hIcon,          Icon
    m2m wc.hCursor,        Cursor
    m2m wc.hIconSm,        Icon

    invoke RegisterClassEx, ADDR wc

    ret

RegisterWinClass endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

MsgLoop proc

    LOCAL msg:MSG

    push esi
    push edi
    xor edi, edi                        ; clear EDI
    lea esi, msg                        ; Structure address in ESI
    jmp jumpin

    StartLoop:
      invoke TranslateMessage, esi
    ; --------------------------------------
    ; perform any required key processing here
    ; --------------------------------------
      invoke DispatchMessage,  esi
    jumpin:
      invoke GetMessage,esi,edi,edi,edi
      test eax, eax
      jnz StartLoop

    mov eax, msg.wParam
    pop edi
    pop esi

    ret

MsgLoop endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

WndProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

    LOCAL var    :DWORD
    LOCAL caW    :DWORD
    LOCAL caH    :DWORD
    LOCAL Rct    :RECT
    LOCAL buffer1[260]:BYTE  ; these are two spare buffers
    LOCAL buffer2[260]:BYTE  ; for text manipulation etc..

    Switch uMsg
      Case WM_COMMAND

       
        Switch wParam
        ;======== toolbar commands ========
          Case 50
            mov ofn.lStructSize, SIZEOF OPENFILENAME
            mov ofn.lpstrFilter, OFFSET filter
            mov ofn.nMaxFile, 255
            mov ofn.lpstrFile, OFFSET fileName
            mov ofn.lpstrDefExt, OFFSET domyslny
            mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_HIDEREADONLY
            INVOKE GetOpenFileName, ADDR ofn
                         
           
            INVOKE CreateFile, ADDR input, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
            mov file, eax
            INVOKE GetFileSize, file, NULL
            mov size, eax
            INVOKE GlobalAlloc, GMEM_MOVEABLE OR GMEM_ZEROINIT, size
            mov memory, eax
            INVOKE GlobalLock, memory
            mov pointer, eax
            INVOKE ReadFile, file, pointer, size, ADDR filledMemory, NULL
            INVOKE CloseHandle, file
                             
           
            INVOKE CreateFile, ADDR output, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
            mov file, eax
            INVOKE WriteFile, file, pointer, size, ADDR filledMemory, NULL
            INVOKE CloseHandle, file
            INVOKE GlobalFree, memory

          Case 51
            fn MessageBox,hWin,"WM_COMMAND ID 52", \
                          ADDR szDisplayName,MB_OK

      Endsw

      Case WM_CREATE
        invoke Do_ToolBar,hWin

      Case WM_SYSCOLORCHANGE
        invoke Do_ToolBar,hWin

      Case WM_SIZE
        invoke SendMessage,hToolBar,TB_AUTOSIZE,0,0

      Case WM_PAINT
        invoke Paint_Proc,hWin
        return 0

      Case WM_CLOSE

      Case WM_DESTROY
        invoke PostQuitMessage,NULL
        return 0

    Endsw

    invoke DefWindowProc,hWin,uMsg,wParam,lParam

    ret

WndProc endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE

TopXY proc wDim:DWORD, sDim:DWORD

    mov eax, [esp+8]
    sub eax, [esp+4]
    shr eax, 1

    ret 8

TopXY endp

OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

Paint_Proc proc hWin:DWORD

    LOCAL hDC      :DWORD
    LOCAL btn_hi   :DWORD
    LOCAL btn_lo   :DWORD
    LOCAL Rct      :RECT
    LOCAL Ps       :PAINTSTRUCT

    mov hDC, rv(BeginPaint,hWin,ADDR Ps)

  ; ----------------------------------------

    mov btn_hi, rv(GetSysColor,COLOR_BTNHIGHLIGHT)

    mov btn_lo, rv(GetSysColor,COLOR_BTNSHADOW)

  ; ----------------------------------------

    invoke EndPaint,hWin,ADDR Ps

    ret

Paint_Proc endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

end start

hutch--

"size" is a reserve word in MASM, change the variable name to something else like "file_size".
Download site for MASM32      New MASM Forum
https://masm32.com          https://masm32.com/board/index.php

ciapek

Thanks, but it still doesn't work. It should load file and save it in another created file. When I click the button I only see OpenFile Dialog

hutch--

The trick to debug this test piece is to test it in pieces. If your file open dialog is showing then check to see if the file name is returned when you close it. Once that works you can then call CreateFile() and test its return value to ensure you have a valid file handle.

If this works OK them allocate the memory for it and read the files contents into it.

The only reliable way to write code like this is to test it sequentially to ensure each bit works in the right order.
Download site for MASM32      New MASM Forum
https://masm32.com          https://masm32.com/board/index.php

ciapek

Thanks. Now it's work. I've got really stupid mistake.