Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.219.22.169] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток.
Подскажите пожалуйста начинающему любителю в правильном написании АПИ функций. В приведенной ниже программе после повторного вывода диалогового окна, в предыдущем окне текст заменяется на тот, который выводится в последнем окне. В чем причина? ;000.asm .386 .model flat, stdcall option casemap :none ; case sensitive include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\gdi32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\Comctl32.inc include \masm32\include\comdlg32.inc include \masm32\include\shell32.inc include \masm32\include\oleaut32.inc includelib \masm32\lib\masm32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\Comctl32.lib includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\shell32.lib includelib \masm32\lib\oleaut32.lib include \masm32\macros\macros.asm include \masm32\include\Fpu.inc includelib \masm32\lib\Fpu.lib include RASSCHET_1.inc include RASSCHET_4.inc include @_OTVET_1.inc include @OBNUL_STR_MES.inc include @_MASSIV.inc includelib PREOBRAZOVANIA.lib ; ~~~~~~~~~ WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD Dlgnomodproc PROTO :DWORD,:DWORD,:DWORD,:DWORD Bitmapproc PROTO :DWORD,:DWORD,:DWORD,:DWORD StaticImage PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD .data include D_A_T_A__SEGMENT.inc Ps PAINTSTRUCT < ? > XM DWORD ? YM DWORD ? statClass db "STATIC",0 .code start: mov hInstance, rv(GetModuleHandle, 0) ; -- rv -- macros.asm fn DialogBoxParam, hInstance, "DIAL1", 0, ADDR WndProc, 0 fn ExitProcess,0 ; ------- WndProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD .if uMsg == WM_INITDIALOG mov HWNDIAL_1, rv(GetDlgItem, hWin, 1) ;--- получить дескрипторы окон редактирования mov HWNDIAL_2, rv(GetDlgItem, hWin, 2) mov HWNDIAL_5, rv(GetDlgItem, hWin, 8) mov HWNDCOMBOBOX, rv(GetDlgItem, hWin, 555) ;--- получить дескрипторы окон редактирования mov HWNDCOMBOBOX_2, rv(GetDlgItem, hWin, 333) fn SendMessage, hWin, WM_SETICON, 0, rv(LoadIcon, hInstance, 100) fn SetMenu, hWin, rv(LoadMenu, hInstance, "MENUP") fn SendMessage, HWNDCOMBOBOX, CB_ADDSTRING, 1, ADDR LENT_Kc+24 fn SendMessage, HWNDCOMBOBOX, CB_ADDSTRING, 1, ADDR LENT_Kc+16 fn SendMessage, HWNDCOMBOBOX, CB_ADDSTRING, 1, ADDR LENT_Kc+8 fn SendMessage, HWNDCOMBOBOX, CB_SETCURSEL, 0, 1 mov ecx, 21 @@: mov eax, 8 dec ecx push ecx jz @F mul ecx mov ebx, eax fn SendMessage, HWNDCOMBOBOX_2, CB_ADDSTRING, 1, ADDR TIP_TR+[ebx] pop ecx jmp @B @@: fn SendMessage, HWNDCOMBOBOX_2, CB_SETCURSEL, 0, 1 ;------ .elseif uMsg == WM_COMMAND @OBNUL_STR_MES ;--- получить отредактированные строки fn SendMessage, HWNDIAL_1, WM_GETTEXT, 150, ADDR TEXT1 fn SendMessage, HWNDIAL_2, WM_GETTEXT, 150, ADDR TEXT2 fn SendMessage, HWNDIAL_5, WM_GETTEXT, 150, ADDR TEXT5 ;--- получить строку окна COMBOBOX fn SendMessage, HWNDCOMBOBOX, CB_GETCURSEL, 0, 0 ;--- теперь сам текст fn SendMessage, HWNDCOMBOBOX, CB_GETLBTEXT, EAX, ADDR STR_COMBOBOX .if wParam == 15 fn MessageBox, hWin, ADDR STR3, "Разъяснения", 1000h ; MB_SYSTEMMODAL .elseif wParam == 14 fn CreateDialogParam,hInstance, "DIAL3", 0, ADDR Bitmapproc, 0 .elseif wParam == 5 .if ([TEXT1] == 0) || ([TEXT1] == "0") || ([TEXT2] == 0) || ([TEXT2] == "0") fn MessageBox, hWin, "Недостаточно данных или введен 0. Читай разъяснения", "Неверные данные", MB_ICONWARNING xor eax, eax ret .endif RASSCHET_1 RASSCHET_4 @_OTVET_1 ; ######################################## fn CreateDialogParam,hInstance, "DIAL2", 0, ADDR Dlgnomodproc, 0 ; ######################################## .elseif wParam == 12 .if ([TEXT1] == 0) || ([TEXT1] == "0") || ([TEXT2] == 0) || ([TEXT2] == "0") fn MessageBox, hWin, "Недостаточно данных или введен 0. Читай разъяснения", "Неверные данные", MB_ICONWARNING xor eax, eax ret .endif ;--- получить строку окна COMBOBOX_2 fn SendMessage, HWNDCOMBOBOX_2, CB_GETCURSEL, 0, 0 ;--- теперь сам текст fn SendMessage, HWNDCOMBOBOX_2, CB_GETLBTEXT, EAX, ADDR STR_COMBOBOX_2 RASSCHET_1 ; ---- mov ecx, 21 MET_1: lea esi, STR_COMBOBOX_2 mov eax, 8 dec ecx jz MET_2 mul ecx mov ebx, eax lea edi, TIP_TR+[ebx] push ebx push ecx ; ---- mov ecx, 8 dec esi dec edi MET_4: inc esi inc edi dec ecx jz MET_3 mov al, [esi] mov bl, [edi] cmp al, bl je MET_4 pop ecx pop ebx jmp MET_1 MET_3: ; ---- pop ecx pop ebx MET_2: fn FpuAtoFL, ADDR Sc_PRIL+[ebx], ADDR Prom_1, DEST_MEM fn FpuComp, ADDR Sc_PRIL_MEM, ADDR Prom_1, SRC1_REAL or SRC2_REAL test eax, CMP_GREATER ;--- если pervoe_1mem > или = ADDR sravnimoe (в EAX 1) jz BNB ;--- если в EAX 0 fn MessageBox, hWin, "Мощность меньше расчетной. Читай разъяснения", "Неверные данные", MB_ICONWARNING ret BNB: fn FpuAdd, 0, ADDR Prom_1, ADDR Sc_PRIL_MEM, SRC1_DIMM or SRC2_REAL or DEST_MEM ; ---- RASSCHET_4 @_OTVET_1 ; ######################################## fn CreateDialogParam,hInstance, "DIAL2", 0, ADDR Dlgnomodproc, 0 ; ######################################## .endif .if WORD PTR [wParam] == 1 jmp DDL .elseif WORD PTR [EBP+10H] == 2 jmp DDL .elseif WORD PTR [EBP+10H] == 8 DDL: .if WORD PTR [wParam+2] == EN_KILLFOCUS mov ebx, 0 L33: movzx eax, BYTE PTR [TAB+ebx] fn UnregisterHotKey,DWORD PTR [EBP+08H],eax inc ebx cmp ebx, 212 jne L33 .elseif WORD PTR [EBP+12H] == EN_SETFOCUS mov ebx, 0 L44: movzx eax, BYTE PTR [TAB+ebx] fn RegisterHotKey,DWORD PTR [EBP+08H],eax,0,eax inc ebx cmp ebx, 212 jne L44 .endif .endif ;------ .elseif uMsg == WM_HOTKEY .elseif uMsg == WM_CLOSE fn EndDialog,hWin,0 fn ExitProcess,0 .endif xor eax, eax ret ;----------------------------------------------------------- WndProc endp ; ------- Dlgnomodproc proc hDlgWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD LOCAL hDC :DWORD LOCAL rect :RECT Switch uMsg Case WM_PAINT fn BeginPaint,hDlgWin,ADDR Ps mov hDC, eax fn SetBkMode, hDC, TRANSPARENT fn GetClientRect,hDlgWin,ADDR rect fn DrawText ,hDC, ADDR MES, -1,ADDR rect, DT_LEFT fn EndPaint,hDlgWin,ADDR Ps return 0 ;------ Case WM_CLOSE fn DestroyWindow,hDlgWin Endsw xor eax, eax ret ;-------------------------- Dlgnomodproc endp ; ------- Bitmapproc proc hBitWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD LOCAL hBmp :DWORD LOCAL hStatImage :DWORD .if uMsg == WM_INITDIALOG mov hStatImage, rv(StaticImage,NULL,hBitWin,0,0,100,25,65535) mov hBmp, rv(LoadBitmap,hInstance,700) fn SendMessage,hStatImage,STM_SETIMAGE,IMAGE_BITMAP,hBmp ;------ .elseif uMsg == WM_CLOSE fn EndDialog,hBitWin,0 .endif xor eax, eax ret ;-------------------------- Bitmapproc endp ;------ StaticImage proc lpText:DWORD,hParent:DWORD, a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD ; invoke StaticImage,NULL,hWnd,20,20,100,25,500 invoke CreateWindowEx,WS_EX_STATICEDGE, ADDR statClass,lpText, WS_CHILD or WS_VISIBLE or SS_BITMAP, a,b,wd,ht,hParent,ID, hInstance,NULL ret StaticImage endp ; ------- end start Функция CreateDialogParam применена для отображения нескольких окон сразу. |
Сообщ.
#2
,
|
|
|
Забыл разъяснить, что текст строки MES в каждом окне разный
Прикреплённый файл____.JPG (58,51 Кбайт, скачиваний: 493)
Программа не работает на 32 разрядной машине под ХР, а на 64 разрядной под WIN 7, где и создавалась, идет |
Сообщ.
#3
,
|
|
|
Цитата masm32 @ Небось, опять эта известная проблема с Subsystem Version, равной 6.0 на Win7, и 4.0 для WinXP... Это от функций FlsFree/FlsGetValue/FlsAlloc импортируемых из KERNEL32.LIB. Программа не работает на 32 разрядной машине под ХР, а на 64 разрядной под WIN 7, где и создавалась, идет |
Сообщ.
#4
,
|
|
|
Повторюсь, что я начинающий. Если можно подробнее и этих функций FlsFree/FlsGetValue/FlsAlloc я не использовал.
|