Окно на ARM под WinMobile, не работает

Тема в разделе "WASM.BEGINNERS", создана пользователем vover, 22 фев 2010.

  1. vover

    vover Владимир

    Публикаций:
    0
    Регистрация:
    21 авг 2008
    Сообщения:
    202
    Код ниже не хочет нормально отрабатывать, выполнение стопорится на CreateWindowExW. Также можно пару раз поймать бряки в WindowProc, но как выполнится DefWindowProcW наступает и там тишина.
    На эмуляторе появляется окно, не перерисовывается и виснит. В чём ошибка?
    Код (Text):
    1. include 'wince.inc'
    2.  
    3. macro  adr reg,location {
    4.        add  reg,pc,location-$-8
    5. }
    6. macro adrl reg,address {
    7.         add reg,pc,(address-$-8) and 0xff
    8.         add reg,reg,(address-$-4) and 0xffffff00
    9. }
    10.  
    11. struct  WNDCLASS
    12.         style           dw 0x3
    13.         lpfnWndProc     dw WindowProc
    14.         cbClsExtra      dw 0
    15.         cbWndExtra      dw 0
    16.         hInstance       dw 0
    17.         hIcon           dw 0
    18.         hCursor         dw 0
    19.         hbrBackground   dw 0
    20.         lpszMenuName    dw 0
    21.         lpszClassName   dw mestit
    22. ends
    23.  
    24. WM_NULL         equ     0x0000
    25. WM_CREATE       equ     0x0001
    26. WM_DESTROY      equ     0x0002
    27.  
    28. WM_CLOSE        equ     0x0010
    29. WM_QUIT         equ     0x0012
    30. ;===================================================
    31.         format  PE GUI
    32.         entry   start
    33.  
    34. section '.data' data readable
    35.         Caption du      'ARM example',0
    36.         Text    du      'Hello ArmCE world',0
    37.         mestit  du      'Asm'
    38.  
    39. section '.bss' data readable writeable
    40.         wc  WNDCLASS <>
    41.         hInstance dw ?
    42.         HWND      dw ?
    43.  
    44. section '.code' code readable executable
    45.  
    46. WindowProc:
    47.         stmfd   sp!, {r4-r6,lr}
    48.         cmp     r1, WM_DESTROY
    49.         beq     wmdestroy
    50.         b       def
    51. wmdestroy:
    52.         mov     r0,0
    53.         bl      PostQuitMessage
    54.         b       ret
    55. def:
    56.         bl      DefWindowProcW
    57. ret:
    58.         ldmfd   sp!, {r4-r6,pc}
    59.  
    60. start:
    61.         apscall GetModuleHandleW,0
    62.         adrl    R1,hInstance
    63.         STR     R0,[R1]
    64.  
    65.         adrl    R1, wc
    66.         STR     R0,[R1,WNDCLASS.hInstance]
    67.         mov     R0, r1
    68.         BL      RegisterClassW          ;ALL OK
    69.  
    70.         SUB     SP, SP, 0x20            ;Singling stack
    71.  
    72.         MOV     LR, 0x80000000
    73.         STR     LR, [SP]                ;x
    74.         STR     LR, [SP,0x4]            ;y
    75.         STR     LR, [SP,0x8]            ;nWidth
    76.         STR     LR, [SP,0xC]            ;nHeight
    77.  
    78.         MOV     LR, 0
    79.         STR     LR, [SP,0x10]           ;hWndParen
    80.         STR     LR, [SP,0x14]           ;hMenu
    81.  
    82.         adrl    R1, hInstance
    83.         ldr     LR,[r1]
    84.         STR     LR, [SP,0x18]           ;hInstance
    85.  
    86.         MOV     LR, 0
    87.         STR     LR, [SP,0x1C]           ;lpParam
    88.  
    89.         MOV     R3, 0x10000000          ;dwStyle
    90.  
    91.         adrl    R2, Caption             ;lpWindowName
    92.         adrl    R1, mestit              ;lpClassName,
    93.  
    94.         MOV     R0, 0                   ;dwExStyle
    95.  
    96.         bl     CreateWindowExW          ; <== ERROR
    97.         adrl    R1,HWND
    98.         STR     R0,[R1]
    99.  
    100.         ADD     SP, SP, 0x20
    101.  
    102.         adrl   R1, HWND
    103.         ldr     R0,[r1]
    104.         bl ShowWindow
    105.  
    106. section '.idata' import data readable writeable
    107.  
    108.         library coredll,'COREDLL.DLL'
    109.         include 'APICE\COREDLL.INC'
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    vover
    С DefWindowProc на первый взгляд всё нормально. А вот куда у Вас убежит управление после ShowWindow неясно. Не знаю, как там в WinCE, но по хорошему надо бы сохранять/восстанавливать регистры и управление системе возвращать:
    STMFD SP!, {R0-R12,LR}
    ....
    LDMFD SP!, {R0-R12,PC}

    К тому же непонятно, кто у Вас вообще цикл приёма-передачи сообщений крутит.
     
  3. vover

    vover Владимир

    Публикаций:
    0
    Регистрация:
    21 авг 2008
    Сообщения:
    202
    l_inc, ну после ShowWindow ясно, что не дописано ещё.
    А цикл приёма-передачи сообщений нужен раньше чем окно создастся ? Я в IDA вообще не могу отследить результат работы CreateWindowExW, после вызова которого выполнение улетает непонятно куда, и не возвращается (
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    vover
    Ну дык... :) тогда непонятно Ваше удивление насчёт неработоспособности (даже при условии отсутствия других ошибок). Мало ли чего там после ShowWindow наисполняется, и какие последствия это за собой повлечь может.
    В каком смысле "раньше"? Чьи ж тогда сообщения тогда поток будет выбирать в цикле, если окна нету?
    В общем, отправляю к азам. :) Правда, я не в курсе специфики WinMobile. Наверное, возможны незначительные отличия.
     
  5. vover

    vover Владимир

    Публикаций:
    0
    Регистрация:
    21 авг 2008
    Сообщения:
    202
    Ох! извиняюсь, оказывается это только в иде не работало. С отладочными месаджбоксами всё запустилось ^ ^.