GetDlgItemTextA - jak pobrać znaki z bufora

0

Witam!

Próbuje napisać prosty program w FASMie do liczenia pierwiastków trójmianu kwadratowego ze wzorów Viete'a w WinAPI. Aby to osiągnąć korzystam z 3 pól tekstowych, jednak mam małe problemy z funkcją GetDlgItemText. Zgodnie z jej opisem na msdn muszę zrobić bufor na tekst do którego zapisywane będą znaki. No więc w przypadku mojego kodu wygląda to mniej więcej tak:

invoke  GetDlgItemText,[hwnddlg],ID_MESSAGE1,tekscik1,2

;i dalej zadeklarowana tablica

tekscik1 db 0,0

Zgodnie z opisem funkcja powinna zwracać wartość odpowiadającą ilości wczytanych do tablicy znaków, jednak gdy zrobię coś w stylu

cmp eax,2 
je .processed

Nie działa (okno się wyłącza). Nie mogę również odwołać się do 2 elementu tablicy tekscik1 poprzez choćby:

mov al,[tekscik1+1]

Głównym celem jaki muszę zrealizować jest pobranie dwóch elementów z tablicy, ich zamiana z wartości ascii na wartość dziesiętną i dalej wykonanie odpowiednich operacji arytmetycznych i odpowiednie zaprezentowanie wyniku.
Wrzucam cały kod:


format PE GUI 4.0
entry start

include 'win32a.inc'

ID_CAPTION         = 101
ID_MESSAGE1         = 102
ID_MESSAGE2         = 103
ID_MESSAGE3         = 104
ID_ICONERROR       = 201
ID_ICONINFORMATION = 202
ID_ICONQUESTION    = 203
ID_ICONWARNING     = 204
ID_TOPMOST         = 301

section '.text' code readable executable

  start:

        invoke  GetModuleHandle,0
        invoke  DialogBoxParam,eax,37,HWND_DESKTOP,DialogProc,0
        or      eax,eax
        jz      exit
        invoke  MessageBox,HWND_DESKTOP,message,caption,[flags]
  exit:
        invoke  ExitProcess,0

proc DialogProc hwnddlg,msg,wparam,lparam
        push    ebx esi edi
        cmp     [msg],WM_INITDIALOG
        je      .wminitdialog
        cmp     [msg],WM_COMMAND
        je      .wmcommand
        cmp     [msg],WM_CLOSE
        je      .wmclose
        xor     eax,eax
        jmp     .finish
  .wminitdialog:

        jmp     .processed
  .wmcommand:
        cmp     [wparam],BN_CLICKED shl 16 + IDCANCEL
        je      .wmclose
        cmp     [wparam],BN_CLICKED shl 16 + IDOK
        jne     .processed

        xor eax,eax
        invoke  GetDlgItemText,[hwnddlg],ID_MESSAGE1,tekscik1,2
        cmp eax,2
        je .processed

  .wmclose:
        invoke  EndDialog,[hwnddlg],0
  .processed:
        mov     eax,1
  .finish:
        pop     edi esi ebx
        ret
endp

section '.bss' readable writeable

  flags dd ?
  caption rb 40h
  message rb 100h
  tekscik1 db 0,0
   tekscik2 db 0,0
    tekscik3 db 0,0

section '.idata' import data readable writeable

  library kernel,'KERNEL32.DLL',\
          user,'USER32.DLL'

  import kernel,\
         GetModuleHandle,'GetModuleHandleA',\
         ExitProcess,'ExitProcess'

  import user,\
         DialogBoxParam,'DialogBoxParamA',\
         CheckRadioButton,'CheckRadioButton',\
         GetDlgItemText,'GetDlgItemTextA',\
         IsDlgButtonChecked,'IsDlgButtonChecked',\
         MessageBox,'MessageBoxA',\
         EndDialog,'EndDialog'

section '.rsrc' resource data readable

  directory RT_DIALOG,dialogs

  resource dialogs,\
           37,LANG_ENGLISH+SUBLANG_DEFAULT,demonstration

  dialog demonstration,'Wzory Viete''a',70,70,190,78,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
    dialogitem 'STATIC','&Dany jest wielomian ax^2+bx+c. Podaj',-1,30,10,134,134,WS_VISIBLE
    dialogitem 'STATIC','&Wspolczynnik a: ',-1,10,30,70,8,WS_VISIBLE
    dialogitem 'EDIT','',ID_MESSAGE1,70,30,15,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP
    dialogitem 'STATIC','&Wspolczynnik b: ',-1,10,45,70,8,WS_VISIBLE
    dialogitem 'EDIT','',ID_MESSAGE2,70,45,15,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP
    dialogitem 'STATIC','&Wspolczynnik c: ',-1,10,60,70,8,WS_VISIBLE
    dialogitem 'EDIT','',ID_MESSAGE3,70,60,15,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP
    dialogitem 'BUTTON','OK',IDOK,130,30,45,15,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
    dialogitem 'BUTTON','C&ancel',IDCANCEL,130,50,45,15,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON

  enddialog
0
invoke  GetDlgItemText,[hwnddlg],ID_MESSAGE1,tekscik1,2
 
;i dalej zadeklarowana tablica
 
tekscik1 db 0,0

A robisz miejsce na znak NULL? Bo w tej chwili masz miejsce na jeden znak, plus znak zerowy.
W tej sytuacji funkcja ci nigdy nie zwróci 2, bo zwracana wartość nie liczy nulla...

Daj większy bufor.

1 użytkowników online, w tym zalogowanych: 0, gości: 1