2010-10-25 2 views
2

Я пытаюсь вручную вызвать RegisterClassEx Windows API без использования структуры WNDCLASS в разделе .data, мне нужно создать эту структуру только с помощью команды push.RegisterClassEx в сборке

Не мог бы кто-нибудь помочь мне в этом, пожалуйста?

Большое спасибо

+0

Зачем вам нужна сборка для этого? – joni

+0

@joni: ему не нужна сборка, чтобы сделать это. Он просто * хочет * сделать это в сборке :) – jyz

+0

Как один из этих «I'm-cool-because-I-write-win32/64-apps-in-asm-just-for-fun-and-to- учиться-что-то "-иро, он должен уметь выяснить это сам, чтобы заработать медаль: P – joni

ответ

3

На самом деле вы можете легко делать то, что вы хотите. Вам просто нужно быть осторожным, чтобы правильно рассчитать адреса каждого элемента структуры. Но это тоже непростая задача ...;)

Пожалуйста, проверьте код, который я сделал:

WinMain: 
    push ebp 
    mov ebp, esp 
    add esp, -50h 

    push 7F00h 
    push 0h 
    call LoadIconA 

    mov ebx, eax 

    push 7F00h 
    push 0h 
    call LoadCursorA 
    ;eax = return of LoadCursorA 
    ;ebx = return of LoadIconA 

    mov dword ptr ss:[ebp-30h], 30h     ;WNDCLASSEX.cbSize,   dd WNDCLASSEX_size 
    mov dword ptr ss:[ebp-2Ch], 3h     ;WNDCLASSEX.style,   dd CS_VREDRAW + CS_HREDRAW 
    mov dword ptr ss:[ebp-28h], WndProc    ;WNDCLASSEX.lpfnWndProc,  dd WndProc 
    mov dword ptr ss:[ebp-24h], 0h     ;WNDCLASSEX.cbClsExtra,  dd NULL 
    mov dword ptr ss:[ebp-20h], 0h     ;WNDCLASSEX.cbWndExtra,  dd NULL 
    mov dword ptr ss:[ebp-1Ch], 0h     ;WNDCLASSEX.hInstance,  dd NULL 
    mov dword ptr ss:[ebp-18h], ebx     ;WNDCLASSEX.hIcon,   dd return of LoadIconA 
    mov dword ptr ss:[ebp-14h], eax     ;WNDCLASSEX.hIconSm,   dd return of LoadCursorA 
    mov dword ptr ss:[ebp-10h], 06h     ;WNDCLASSEX.hbrBackground, dd COLOR_BTNFACE + 1 
    mov dword ptr ss:[ebp-0Ch], 0h     ;WNDCLASSEX.lpszMenuName,  dd NULL 
    mov dword ptr ss:[ebp-08h], offset WndProc  ;WNDCLASSEX.lpszClassName, dd offset of ClassName 
    mov dword ptr ss:[ebp-04h], ebx     ;WNDCLASSEX.hCursor,   dd return of LoadIconA 

    lea eax,[ebp-30h] 
    push eax 
    call RegisterClassEx 

Вам просто нужно поставить это перед вызовом CreateWindow.

Любые сомнения просто кричат.

PS .: Помните, что WndProc - это процедура цикла вашей программы сборки.

+0

'ss:' не требуется - это регистр сегмента по умолчанию для ebp. – Abyx

+0

@Abyx: да, я знаю, только для уточнения :) – jyz

0

Обратный толчок структура в стек, толчок эффективный адрес к первому элементу, вызов RegisterClassEx, поп структура из стека.

1
.data 
    wndclass WNDCLASS 
.code 
    push offset wndclass 
    call RegisterClassEx 

Вы должны подтолкнуть его смещение, а не сама структура

Для локальной переменной, нажмите ее адрес

LOCAL wndclass:WNDCLASS 
lea edx, wndclass 
push edx 
call RegisterClassEx