News:

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

parser

Started by ragdog, November 25, 2007, 02:31:29 PM

Previous topic - Next topic

ragdog

#15
hi

i have added EM_GETLINECOUNT can your help me i have trouble with my counter to compare


            invoke SendMessage,hEdit,EM_GETLINECOUNT,0,0
               mov edi,eax
               mov esi,0
               
               xor ebx,ebx
         @1:
            invoke RtlZeroMemory, ADDR sz1, 100
               mov WORD PTR sz1, 100
            invoke SendMessage, hEdit, EM_GETLINE, ebx, ADDR sz1
              test eax, eax
                jz @F
               
            invoke szTrim, ADDR sz1
            invoke RtlZeroMemory, ADDR sz2, 100
            invoke Format,addr sz1,ADDR sz2,addr szformat
            invoke SendMessage, hList, LB_ADDSTRING, 0, ADDR sz2
               inc ebx
               jmp @1
               
            @@:
            invoke SendMessage, hList, LB_ADDSTRING, 0, ADDR  szformat1
               inc ebx
               inc esi
               cmp edi,esi           <<----------
               jne @1
       @ret:


or have a set not correct a jump?

thanks in forward

ragdog

[attachment deleted by admin]

ragdog

cannot anywere help me please?

Mark Jones

Have you tried following the code in a debugger such as OllyDbg?

Also, ESI and EDI must be preserved in any callback proc. (If this is part of your WndProc, leaving either register modified can cause problems.)
"To deny our impulses... foolish; to revel in them, chaos." MCJ 2003.08

MichaelW

My previous code had several problems.

The return value for the EM_GETLINE message is the number of characters in the copied line or zero if the line number specified in wParam is greater than the number of lines in the control. Because the return value for a blank line is also zero the code was exiting from the loop at the first blank line, instead of processing all of the lines.

For an edit control the copied line is not null terminated. The:

invoke RtlZeroMemory, ADDR sz1, 100

Corrected this problem by ensuring that the copied line would be null terminated, but only if blank lines were not being processed. The edit control does not copy blank lines, so because of the 100 in the first byte, the blank lines were effectively a null terminated “d�.

The corrected version:

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    include \masm32\include\masm32rt.inc
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    .data
      hInstance dd 0
      hWndEdit  dd 0
      hWndList  dd 0
      sz1       db 100 dup(0)
      sz2       db 100 dup(0)
    .code

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

DlgProc proc uses ebx esi hDlg:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

    SWITCH uMsg

      CASE WM_INITDIALOG

        invoke GetDlgItem, hDlg, 101
        mov hWndEdit, eax
        invoke GetDlgItem, hDlg, 102
        mov hWndList, eax

      CASE WM_COMMAND

        SWITCH wParam

          CASE 103

            ; ---------------------------------------
            ; Use number of lines as a loop counter.
            ; ---------------------------------------

            invoke SendMessage,hWndEdit,EM_GETLINECOUNT,0,0
            mov ebx, eax
            xor esi, esi
          @@:

            ; --------------------------------------------------
            ; First word of buffer must be set to buffer length.
            ; --------------------------------------------------

            mov WORD PTR sz1, 100

            invoke SendMessage, hWndEdit, EM_GETLINE, esi, ADDR sz1

            ; -----------------------------------------------------
            ; Append a null terminator to the end of the returned
            ; string (edit controls do not automatically do this).
            ; -----------------------------------------------------

            mov [eax+sz1], 0

            ; ---------------------------------------
            ; Remove leading and trailing spaces and
            ; tabs from the string, if necessary.
            ; ---------------------------------------

            ;invoke szTrim, ADDR sz1

            invoke RtlZeroMemory, ADDR sz2, 100
            invoke szMultiCat, 3, ADDR sz2, chr$("<"), ADDR sz1, chr$(">")

            invoke SendMessage, hWndList, LB_ADDSTRING, 0, ADDR sz2

            inc esi
            cmp esi, ebx
            jb  @B

          CASE IDCANCEL

            invoke EndDialog, hDlg, NULL

        ENDSW


      CASE WM_CLOSE

        invoke EndDialog, hDlg, NULL

    ENDSW

    xor eax, eax
    ret

DlgProc endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    invoke GetModuleHandle, NULL
    mov hInstance, eax

    Dialog "Test", \
           "Courier New",8, \
           WS_OVERLAPPED or WS_SYSMENU or DS_CENTER, \
           3,0,0,300,225,1024

    DlgEdit ES_MULTILINE or WS_VSCROLL or WS_HSCROLL or \
            ES_AUTOVSCROLL or ES_AUTOHSCROLL or \
            ES_WANTRETURN or WS_BORDER, \
            10,10,278,80,101

    DlgList WS_VSCROLL or WS_BORDER,10,100,278,80,102

    DlgButton "Format",0,125,180,50,15,103

    CallModalDialog hInstance,0,DlgProc,NULL

    exit
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start
eschew obfuscation