Новые книги

В книге детально рассмотрены основные подсистемы и функции ядер Linux серии 2.6, включая особенности построения, реализации и соответствующие программны интерфейсы. Рассмотренные вопросы включают: планирование выполнения процессов, управление временем и таймеры ядра, интерфейс системных вызовов, особенности адресации и управления памятью, страничный кэш, подсистему VFS, механизмы синхронизации, проблемы переносимости и особенности отладки. Автор книги является разработчиком основных подсистем ядра Linux. Ядро рассматривается как с теоретической, так и с прикладной точек зрения, что может привлечь читателей различными интересами и потребностями.

Книга может быть рекомендована как начинающим, так и опытным разработчикам программного обеспечения, а также в качестве дополнительных учебных материалов.
Инфобизнес (бизнес по продаже информации, обучение, тренинги) даст вам настоящую свободу: у вас не будет начальников; не нужно будет тащиться в пробках на работу; ваш доход будет зависеть только от вас; вы сможете наслаждаться путешествиями и зарабатывать в любой стране мира; и что самое главное – вы получите радость и удовлетворение от своей деятельности!

Если вы хотите получить все, что описано выше, – читайте эту книгу – пошаговое руководство по построению информационного бизнеса с нуля.

Выбор ниши, привлечение первых клиентов, создание линейки продуктов и увеличение продаж – эти и многие другие вопросы освещены в этой книге максимально подробно.

Особую ценность представляют алгоритмы действий и чек-листы, которые помогут внедрить рекомендации быстро и с максимальной эффективностью.

     Основные шаги при создании окна:
    1. Получить дискриптор Вашей программы(обязательно)
    2. Получить указатель на командную строку(не обязательно)
    3. Зарегистрировать класс окна(не требуется, если Вы используете
        встроенный тип окна, например MessageBox)
    4. Создать окно(обязательно)
    5. Показать окно(если хотите немедленно показать окно)
    6. Обновить окно
    7. Образовать бесконечный цикл, обрабатывающий сообщения окна
    8. Если есть сообщения, то обработать специализированной функцией
        ответственной за окно
    9. Выйти из программы, если пользователь закрыл окно

Разберем простую программу, которая выводит только окно.
Я взял пример программы Wap32.asm из пакета TASM и несколько упостил ее.

.386
.model flat, stdcall
include win32.inc

Файл win32.inc содержит некоторые нужные константы и структуры

extrn            CreateWindowExA:PROC
extrn            DefWindowProcA:PROC
extrn            DispatchMessageA:PROC
extrn            ExitProcess:PROC
extrn            GetMessageA:PROC
extrn            GetModuleHandleA:PROC
extrn            LoadCursorA:PROC
extrn            LoadIconA:PROC
extrn            PostQuitMessage:PROC
extrn            RegisterClassA:PROC
extrn            ShowWindow:PROC
extrn            TranslateMessage:PROC
extrn            UpdateWindow:PROC


.data

newhwnd          dd 0
msg              MSGSTRUCT   <?>
wc               WNDCLASS    <?>
hInst            dd 0
szTitleName      db 'Win32 Assembly Program',0
szClassName      db 'ASMCLASS32',0

.code
start:

        push    0
        call    GetModuleHandleA
        mov     [hInst], eax

Получим дискриптор программы.
Далее инициализируем структуру WndClass для регистрации окна

        mov     [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS

clsStyle - определяет стиль класса

        mov     [wc.clsLpfnWndProc], offset WndProc

clsLpfnWndProc - указывает на процедуру окна

        mov     [wc.clsCbClsExtra], 0
        mov     [wc.clsCbWndExtra], 0

        mov     eax, [hInst]
        mov     [wc.clsHInstance], eax

clsHInstance - содержит дискриптор программы

        push    IDI_APPLICATION
        push    0
        call    LoadIconA
        mov     [wc.clsHIcon], eax

        push    IDC_ARROW
        push    0
        call    LoadCursorA
        mov     [wc.clsHCursor], eax

        mov     [wc.clsHbrBackground], COLOR_WINDOW + 1
        mov     dword ptr [wc.clsLpszMenuName], 0
        mov     dword ptr [wc.clsLpszClassName], offset szClassName

clsLpszClassName - определяет имя класса окна

        push    offset wc
        call    RegisterClassA

Создаем окно:

        push    0
        push    [hInst]                  ; дискриптор окна
        push    0
        push    0
        push    CW_USEDEFAULT            ; высота
        push    CW_USEDEFAULT            ; ширина
        push    CW_USEDEFAULT            ; y
        push    CW_USEDEFAULT            ; x
        push    WS_OVERLAPPEDWINDOW      ; стиль
        push    offset szTitleName       ; заголовок окна
        push    offset szClassName       ; имя класса
        push    0                        ; дополнительный стиль

        call    CreateWindowExA

        mov     [newhwnd], eax

newhwnd - дискриптор окна
Покажем окно:

        push    SW_SHOWNORMAL
        push    [newhwnd]
        call    ShowWindow

Обновим окно:

        push    [newhwnd]
        call    UpdateWindow

Создаем цикл для обработки сообщений окна

msg_loop:
        push    0
        push    0
        push    0
        push    offset msg
        call    GetMessageA

        cmp     ax, 0
        je      end_loop

        push    offset msg
        call    TranslateMessage

        push    offset msg
        call    DispatchMessageA

        jmp     msg_loop

end_loop:

выход из программы:

        push    [msg.msWPARAM]
        call    ExitProcess

Процедура окна:

WndProc          proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\
                 wparam:DWORD, lparam:DWORD

Win32 требует, чтобы EBX, EDI, и ESI были сохранены

        cmp     [wmsg], WM_DESTROY
        je      wmdestroy

        push    [lparam]
        push    [wparam]
        push    [wmsg]
        push    [hwnd]
        call    DefWindowProcA
        jmp     finish

wmdestroy:
        push    0
        call    PostQuitMessage
        mov     eax, 0
finish:
        ret
WndProc          endp
ends
end start

Программу можно взять здесь

На первый взгляд кажется, что слишком много написано для простой программы. На самом же деле писать все полностью не нужно, достаточно написать файл один раз, а потом использовать его как шаблон для своих новых программ. Можно создать объектный файл и использовать его как загрузочный код, а писать только процедуру окна(WinProc).