Код ниже не хочет нормально отрабатывать, выполнение стопорится на CreateWindowExW. Также можно пару раз поймать бряки в WindowProc, но как выполнится DefWindowProcW наступает и там тишина. На эмуляторе появляется окно, не перерисовывается и виснит. В чём ошибка? Код (Text): include 'wince.inc' macro adr reg,location { add reg,pc,location-$-8 } macro adrl reg,address { add reg,pc,(address-$-8) and 0xff add reg,reg,(address-$-4) and 0xffffff00 } struct WNDCLASS style dw 0x3 lpfnWndProc dw WindowProc cbClsExtra dw 0 cbWndExtra dw 0 hInstance dw 0 hIcon dw 0 hCursor dw 0 hbrBackground dw 0 lpszMenuName dw 0 lpszClassName dw mestit ends WM_NULL equ 0x0000 WM_CREATE equ 0x0001 WM_DESTROY equ 0x0002 WM_CLOSE equ 0x0010 WM_QUIT equ 0x0012 ;=================================================== format PE GUI entry start section '.data' data readable Caption du 'ARM example',0 Text du 'Hello ArmCE world',0 mestit du 'Asm' section '.bss' data readable writeable wc WNDCLASS <> hInstance dw ? HWND dw ? section '.code' code readable executable WindowProc: stmfd sp!, {r4-r6,lr} cmp r1, WM_DESTROY beq wmdestroy b def wmdestroy: mov r0,0 bl PostQuitMessage b ret def: bl DefWindowProcW ret: ldmfd sp!, {r4-r6,pc} start: apscall GetModuleHandleW,0 adrl R1,hInstance STR R0,[R1] adrl R1, wc STR R0,[R1,WNDCLASS.hInstance] mov R0, r1 BL RegisterClassW ;ALL OK SUB SP, SP, 0x20 ;Singling stack MOV LR, 0x80000000 STR LR, [SP] ;x STR LR, [SP,0x4] ;y STR LR, [SP,0x8] ;nWidth STR LR, [SP,0xC] ;nHeight MOV LR, 0 STR LR, [SP,0x10] ;hWndParen STR LR, [SP,0x14] ;hMenu adrl R1, hInstance ldr LR,[r1] STR LR, [SP,0x18] ;hInstance MOV LR, 0 STR LR, [SP,0x1C] ;lpParam MOV R3, 0x10000000 ;dwStyle adrl R2, Caption ;lpWindowName adrl R1, mestit ;lpClassName, MOV R0, 0 ;dwExStyle bl CreateWindowExW ; <== ERROR adrl R1,HWND STR R0,[R1] ADD SP, SP, 0x20 adrl R1, HWND ldr R0,[r1] bl ShowWindow section '.idata' import data readable writeable library coredll,'COREDLL.DLL' include 'APICE\COREDLL.INC'
vover С DefWindowProc на первый взгляд всё нормально. А вот куда у Вас убежит управление после ShowWindow неясно. Не знаю, как там в WinCE, но по хорошему надо бы сохранять/восстанавливать регистры и управление системе возвращать: STMFD SP!, {R0-R12,LR} .... LDMFD SP!, {R0-R12,PC} К тому же непонятно, кто у Вас вообще цикл приёма-передачи сообщений крутит.
l_inc, ну после ShowWindow ясно, что не дописано ещё. А цикл приёма-передачи сообщений нужен раньше чем окно создастся ? Я в IDA вообще не могу отследить результат работы CreateWindowExW, после вызова которого выполнение улетает непонятно куда, и не возвращается (
vover Ну дык... тогда непонятно Ваше удивление насчёт неработоспособности (даже при условии отсутствия других ошибок). Мало ли чего там после ShowWindow наисполняется, и какие последствия это за собой повлечь может. В каком смысле "раньше"? Чьи ж тогда сообщения тогда поток будет выбирать в цикле, если окна нету? В общем, отправляю к азам. Правда, я не в курсе специфики WinMobile. Наверное, возможны незначительные отличия.
Ох! извиняюсь, оказывается это только в иде не работало. С отладочными месаджбоксами всё запустилось ^ ^.