Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка при создании окна (CreateWindowExA) 
V
    Опции темы
zoidberg
  Дата 29.2.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.7.2006

Репутация: нет
Всего: 0



Для начала вот код:
Код

.386
.model flat,stdcall
;---------------------------
STYLE equ 4003h;CS_VREDRAW + CS_HREDRAW + CS_GLOBALCLASS
WS_OVERLAPPEDWINDOW equ 000CF0000h
SW_SHOWNORMAL equ 1h
wndclass struct
    style dd ?
    wndproc dd ?
    clsextra dd ?
    wndextra dd ?
    hinstance dd ?
    hicon dd ?
    hcursor dd ?
    background dd ?
    menuname dd ?
    classname dd ?
wndclass EndS
msgst struct
    hwnd dd ?
    message dd ?
    wParam dd ?
    lParam dd ?
    time dd ?
    pt dd ?
msgst EndS
extern GetModuleHandleA@4:near
extern DefWindowProcA@16:near
extern LoadCursorA@8:near
extern RegisterClassA@4:near
extern CreateWindowExA@48:near
extern ShowWindow@8:near
extern UpdateWindow@4:near
extern GetMessageA@16:near
extern TranslateMessage@4:near
extern DispatchMessageA@4:near
extern GetLastError@0:near
includelib kernel32.lib
includelib user32.lib
;---------------------------
.data
    HINST dd 0
    NEWHWND dd 0
    MSG msgst <?>
    WC wndclass <?>
    CLASSNAME db 'CLASS32',0
    wndtxt db 'Simple application',0
.code
start:
    push 0
    call GetModuleHandleA@4
    mov HINST,eax
    mov WC.style,STYLE
    mov WC.wndproc,offset wndproc
    mov WC.clsextra,0
    mov WC.wndextra,0
    mov eax,HINST
    mov WC.hinstance,eax
    mov WC.hicon,0
    push 32515
    push 0
    call LoadCursorA@8
    mov WC.hcursor,eax
    mov WC.background,3
    mov WC.menuname,0
    mov WC.classname,offset CLASSNAME
    push offset WC
    call RegisterClassA@4
    push 0
    push HINST
    push 0
    push 0
    push 400
    push 500
    push 100
    push 100
    push WS_OVERLAPPEDWINDOW
    push offset wndtxt
    push offset CLASSNAME
    push 0
    call CreateWindowExA@48
    call GetLastError@0
    mov NEWHWND,eax
    push SW_SHOWNORMAL
    push NEWHWND
    call ShowWindow@8
    push NEWHWND
    call UpdateWindow@4
MSG_LOOP:
    push 0
    push 0
    push 0
    push offset MSG
    call GetMessageA@16
    cmp eax,0
    je END_LOOP
    push offset MSG
    call TranslateMessage@4
    push offset MSG
    call DispatchMessageA@4
    jmp MSG_LOOP
END_LOOP:
    ret
;----------------------------
;ïðîöåäóðà îêíà
;[esp+14h] LPARAM - äîï. èíôîðìàöèÿ
;[esp+10h] WPARAM - äðï. èíôîðìàöèÿ
;[esp+0Ch] MSG - èäåíòèôèêàòîð ñîîáùåíèÿ
;[esp+8h] HWND - äåñêðèïòîð îêíà
wndproc proc
    push dword ptr [esp+14h]
    push dword ptr [esp+10h]
    push dword ptr [esp+0Ch]
    push dword ptr [esp+8h]
    call DefWindowProcA@16
    Ret 16
wndproc EndP
end start


Пытаюсь создать окно, но в eax получаю NULL. Вызвал GetLastError, оно мне вернуло 578h, посмотрел справку: 
Цитата

ERROR_INVALID_WINDOW_HANDLE equ 1400;Invalid window handle.
Про какой хэндл идет речь? Вроде там только HINST и я его получил:
Код

    call GetModuleHandleA@4
    mov HINST,eax

 smile 
PM MAIL   Вверх
586
Дата 1.3.2008, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 2
Всего: 146



Цитата
push dword ptr [esp+14h]
    push dword ptr [esp+10h]
    push dword ptr [esp+0Ch]
    push dword ptr [esp+8h]
    call DefWindowProcA@16

[esp] - адрес возврата
[esp+4h] - hWnd
[esp+8h] - uMsg
[esp+0ch] - wParam
[esp+10h] - lParam
Код
wndproc proc
    push dword ptr [esp+10h]
    push dword ptr [esp+10h]
    push dword ptr [esp+10h]
    push dword ptr [esp+10h]
    call DefWindowProcA@16
    ret 16
wndproc EndP


Это сообщение отредактировал(а) 586 - 1.3.2008, 18:01
PM   Вверх
zoidberg
Дата 1.3.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.7.2006

Репутация: нет
Всего: 0



586, за указание ошибки в смещении спасибо, но проблему с хэндлом это не решает.
PM MAIL   Вверх
586
Дата 1.3.2008, 18:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 2
Всего: 146



Цитата(zoidberg @  1.3.2008,  15:18 Найти цитируемый пост)
но проблему с хэндлом это не решает

Не решает потому, что я не учёл изменения регистра esp (исправил).
Вот переписал в нормальный вид:
Код
.386
.model flat,stdcall
;---------------------------
STYLE equ 4003h;CS_VREDRAW + CS_HREDRAW + CS_GLOBALCLASS
WS_OVERLAPPEDWINDOW equ 000CF0000h
SW_SHOWNORMAL equ 1h
wndclass struct
    style dd ?
    wndproc dd ?
    clsextra dd ?
    wndextra dd ?
    hinstance dd ?
    hicon dd ?
    hcursor dd ?
    background dd ?
    menuname dd ?
    classname dd ?
wndclass EndS
msgst struct
    hwnd dd ?
    message dd ?
    wParam dd ?
    lParam dd ?
    time dd ?
    pt dq ?    ; sizeof(POINT) = 8
msgst EndS
extern GetModuleHandleA@4:near
extern DefWindowProcA@16:near
extern LoadCursorA@8:near
extern RegisterClassA@4:near
extern CreateWindowExA@48:near
extern ShowWindow@8:near
extern UpdateWindow@4:near
extern GetMessageA@16:near
extern TranslateMessage@4:near
extern DispatchMessageA@4:near
extern GetLastError@0:near
extern PostQuitMessage@4:near
includelib kernel32.lib
includelib user32.lib
;---------------------------
.data
    HINST dd 0
    NEWHWND dd 0
    MSG msgst <?>
    WC wndclass <?>
    CLASSNAME db 'CLASS32',0
    wndtxt db 'Simple application',0
.code
start:
    push 0
    call GetModuleHandleA@4
    mov HINST,eax
    mov WC.style,0  : FIX IT
    mov WC.wndproc,offset wndproc
    mov WC.clsextra,0
    mov WC.wndextra,0
    mov eax,HINST
    mov WC.hinstance,eax
    mov WC.hicon,0
    push 32515
    push 0
    call LoadCursorA@8
    mov WC.hcursor,eax
    mov WC.background,16
    mov WC.menuname,0
    mov WC.classname,offset CLASSNAME
    push offset WC
    call RegisterClassA@4
    push 0
    push HINST
    push 0
    push 0
    push 400
    push 500
    push 100
    push 100
    push WS_OVERLAPPEDWINDOW
    push offset wndtxt
    push offset CLASSNAME
    push 0
    call CreateWindowExA@48

    mov NEWHWND,eax
    push SW_SHOWNORMAL
    push NEWHWND
    call ShowWindow@8
    push NEWHWND
    call UpdateWindow@4
MSG_LOOP:
    push 0
    push 0
    push 0
    push offset MSG
    call GetMessageA@16
    test eax, eax
    jz END_LOOP
    push offset MSG
    call TranslateMessage@4
    push offset MSG
    call DispatchMessageA@4
    jmp MSG_LOOP
END_LOOP:
    ret
;----------------------------

wndproc proc
    push ebp
    mov ebp, esp

    mov eax, dword ptr [ebp+0Ch]    ; uMsg
    cmp eax, 2h                ; WM_DESTROY
    jne @f

    push 0
    call PostQuitMessage@4
    jmp exit_p

@@:
    ; default
    push dword ptr [ebp+14h]    ; lParam
    push dword ptr [ebp+10h]    ; wParam
    push dword ptr [ebp+0Ch]    ; uMsg
    push dword ptr [ebp+8h]    ; hWnd
    call DefWindowProcA@16
    pop ebp
    ret 16

exit_p:
    pop ebp
    xor eax, eax
    ret 16
wndproc EndP
end start


PM   Вверх
zoidberg
Дата 2.3.2008, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.7.2006

Репутация: нет
Всего: 0



Цитата(586 @ 1.3.2008,  18:05)
Не решает потому, что я не учёл изменения регистра esp (исправил).

Спасибо. Вроде-бы ошибки свои осознал и прогу собрал, хотя метку (@f) не понял... буду читать мануал.

А тут ты на что намекал?

Код

mov WC.style,0  : FIX IT


Я свой стиль использовал и окно создалось...
Код

mov WC.style,STYLE


Ладно, поперевожу еще мсдн.

Добавлено через 1 минуту и 25 секунд
Жаль, но +1 не дают накинуть.  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.