Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ Помогите найти ошибку!

Автор: c00p3r 3.01.2007 22:31

Уважаемые мастера АСМ! Не получается одна весчь - прошу у вас помощи...
Вообщем, мне надо вывести информацию из структуры FIXED_INFO из функции GetNetworkParams.
Вот что я написал:


.386
.model flat,stdcall

option casemap:none
include 'c:/masm32/include/windows.inc'
include 'c:/masm32/include/user32.inc'
includelib 'c:/masm32/lib/user32.lib' ; calls to functions in user32.lib and kernel32.lib
include 'c:/masm32/include/kernel32.inc'
includelib 'c:/masm32/lib/kernel32.lib'
includelib 'c:/masm32/lib/iphlpapi.lib'


FIXED_INFO STRUC
HostName DWORD ?
FIXED_INFO ENDS

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
GetNetworkParams proto :FIXED_INFO,:DWORD

;==================================
;##############################################################
.DATA ; initialized data

ClassName db 'SimpleWinClass',0; Имя нашего класса окна
AppName db 'Our First Window',0; Имя нашего окна
MsgBoxCaption db 'Shutdowning... Say Goodbye to ur OS!',0
MsgBoxText db 'Hands?',0

;################################################################

.DATA? ; Hеиницилизируемые данные
hInstance HINSTANCE ? ; Хэндл нашей программы
CommandLine LPSTR ?
fi FIXED_INFO <?>
lLen DWORD ?
;#############################################################

.CODE ; Здесь начинается наш код
start:
invoke GetModuleHandle, NULL; Взять хэндл программы
; Под Win32, hmodule==hinstance mov hInstance,eax
mov hInstance,eax

invoke GetCommandLine ; Взять командную строку. Вы не обязаны
;вызывать эту функцию ЕСЛИ ваша программа не обрабатывает командную строку.
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT ; вызвать основную функцию
invoke ExitProcess, eax; Выйти из программы.
; Возвращаемое значение, помещаемое в eax, берется из WinMain'а.
;###################################################
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX ; создание локальных переменных в стеке
LOCAL msg:MSG
LOCAL hwnd:HWND


mov wc.cbSize,SIZEOF WNDCLASSEX ; заполнение структуры wc
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL

mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1

mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax

mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc ; регистрация нашего класса окна
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL
mov hwnd,eax

invoke ShowWindow, hwnd,CmdShow; отобразить наше окно на десктопе
invoke UpdateWindow, hwnd; обновить клиентскую область

.WHILE TRUE ; Enter message loop
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)

invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam; сохранение возвращаемого значения в eax
ret

WinMain endp
;##############################################################
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

.IF uMsg==WM_CLOSE ; если пользователь закрывает окно
invoke PostQuitMessage,NULL; выходим из программы

.ELSEIF uMsg==WM_LBUTTONDOWN
invoke GetNetworkParams, fi, NULL
mov lLen, eax
invoke GetNetworkParams, fi, lLen
invoke MessageBox, hWnd, offset fi.HostName,offset MsgBoxCaption , MB_OK
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam; Дефаултная функция обработки окна
ret
.ENDIF
xor eax,eax

ret
WndProc endp


end start



Но у меня выводит пустой мессджбокс.. Если есть возможность - прошу помочь, и просьба - показать как вывести несколько полей из структуры в один мессджбокс %)
Спасибо, всех с НГ!

Ах да, я использовал Iphlpapi.lib, которую можно скачать с gign4.narod.ru/Iphlpapi.lib
Ссылка на структуру и функцию - http://msdn.microsoft.com/en-us/library/aa365968.aspx