Консультация № 54967
10.09.2006, 23:21
0.00 руб.
0 2 1
здравствуйте, уважаемые.
написал небольшую программу, которая показывает текущее время;
на определенном этапе (создание sub-menu) столкнулся с проблемой, при запуске появляется error-MessageBox с сообщением "Точка входа в процедуру AppendMenu не найдена в библиотеке DLL USER32.DLL"; при компиляции, fasm не находит ошибок и компилирует успешно; будьте любезны, подскажите, в чем баг?

Приложение:
format PE GUI 4.0entry startinclude ‘C:\Temp\fasmw166\INCLUDE\WIN32A.INC‘section ‘.data‘ data readable writeable;------------------------------------------------------------------------- whmain dd ? whinst dd ? hmenu dd ? wtitle db ‘clock‘,0 class_name db ‘class‘,0 id_timer equ 1 mn_color equ 100001 mn_close equ 100002 _color db ‘color setup‘,0 _close db ‘quit‘,0 wmsg MSG wcls WNDCLASS stime SYSTEMTIME _ps PAINTSTRUCT _hdc dd ? _rect RECT _time db ‘%02d:%02d:%02d‘,0 _buff rb 9 db 0section ‘.code‘ readable executable;------------------------------------------------------------------------- start: ;--> registering the window class -------------------------------- invoke GetModuleHandle,NULL mov [whinst],eax mov [wcls.hInstance],eax mov [wcls.style],CS_HREDRAW or CS_VREDRAW mov [wcls.lpfnWndProc],window_procedure mov [wcls.lpszClassName],class_name mov [wcls.hbrBackground],COLOR_WINDOW+1 invoke LoadIcon,NULL,IDI_WINLOGO mov [wcls.hIcon],eax invoke LoadCursor,NULL,IDC_ARROW mov [wcls.hCursor],eax invoke RegisterClass,wcls ;--> creating the main window -------------------------------- invoke CreateWindowEx,\ 0,\ class_name,\ wtitle,\ WS_OVERLAPPEDWINDOW or WS_VISIBLE,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ 120,\ 50,\ NULL,\ NULL,\ [whinst],\ NULL mov [whmain],eax invoke ShowWindow,[whmain],SW_SHOWNORMAL ;--> entering the message loop ------------------------------ window_msg_loop_start: invoke GetMessage,wmsg,NULL,0,0 or eax,eax je window_message_loop_end invoke TranslateMessage,wmsg invoke DispatchMessage,wmsg jmp window_msg_loop_start window_message_loop_end: invoke ExitProcess,0 ;--> the window procedure ------------------------------------------------------------------------------------------- proc window_procedure,hWnd,uMsg,wParam,lParam push ebx esi edi invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam] cmp [uMsg],WM_COMMAND je .wm_command cmp [uMsg],WM_CONTEXTMENU je .wm_contextmenu cmp [uMsg],WM_INITDIALOG je .wm_initdlg cmp [uMsg],WM_DESTROY je .wm_destroy jmp .finish .wm_contextmenu: ;======================================= mov eax, [lParam] ;if so, show the popup menu and eax, 0ffffh mov ebx, [lParam] shr ebx, 16 invoke TrackPopupMenu,[hmenu],TPM_LEFTALIGN,eax,ebx,0,[hWnd],0 jmp .finish ;--------------------------------------- .wm_command: ;======================================= mov eax,[wParam] cmp eax,mn_color ;je .menu_color je .wm_destroy cmp eax,mn_close je .wm_destroy jmp .finish ;--------------------------------------- .wm_initdlg: ;======================================= invoke CreatePopupMenu,0 mov [hmenu],eax invoke AppendMenu, [hmenu],MF_STRING,mn_color,_color invoke AppendMenu, [hmenu],MF_STRING,mn_close,_close invoke SetTimer,[hWnd],id_timer,200,NULL ;0.2 seconds interval invoke GetLocalTime,stime movzx eax,[stime.wHour] movzx ebx,[stime.wMinute] movzx edi,[stime.wSecond] invoke wsprintf,_buff,_time,eax,ebx,edi invoke GetDC,[hWnd] mov [_hdc],eax invoke GetClientRect,[hWnd],_rect invoke DrawText,\ [_hdc],\ _buff,\ -1,\ _rect,\ DT_SINGLELINE or DT_CENTER or DT_VCENTER invoke ReleaseDC,[hWnd],[_hdc] jmp .finish ;--------------------------------------- .wm_destroy: ;======================================= invoke KillTimer,[hWnd],id_timer invoke PostQuitMessage,0 jmp .finish ;--------------------------------------- .finish: ;======================================= pop edi esi ebx ret ;--------------------------------------- endp;-------------------------------------------------------------------------section ‘.idata‘ import data readable writeable library KERNEL32, ‘KERNEL32.DLL‘,\ USER32, ‘USER32.DLL‘,\ GDI32, ‘GDI32.DLL‘ import KERNEL32,\ GetModuleHandle, ‘GetModuleHandleA‘,\ ExitProcess, ‘ExitProcess‘,\ GetLocalTime, ‘GetLocalTime‘ import USER32,\ AppendMenu, ‘AppendMenu‘,\ CreatePopupMenu, ‘CreatePopupMenu‘,\ TrackPopupMenu, ‘TrackPopupMenu‘,\ RegisterClass, ‘RegisterClassA‘,\ CreateWindowEx, ‘CreateWindowExA‘,\ DefWindowProc, ‘DefWindowProcA‘,\ ShowWindow, ‘ShowWindow‘,\ UpdateWindow, ‘UpdateWindow‘,\ LoadCursor, ‘LoadCursorA‘,\ LoadIcon, ‘LoadIconA‘,\ BeginPaint, ‘BeginPaint‘,\ InvalidateRect, ‘InvalidateRect‘,\ EndPaint, ‘EndPaint‘,\ GetMessage, ‘GetMessageA‘,\ GetClientRect, ‘GetClientRect‘,\ GetDC, ‘GetDC‘,\ ReleaseDC, ‘ReleaseDC‘,\ DrawText, ‘DrawTextA‘,\ TranslateMessage, ‘TranslateMessage‘,\ DispatchMessage, ‘DispatchMessageA‘,\ PostQuitMessage, ‘PostQuitMessage‘,\ wsprintf, ‘wsprintfA‘,\ SetTimer, ‘SetTimer‘,\ KillTimer, ‘KillTimer‘ import GDI32,\ TextOut, ‘TextOutA‘

Обсуждение

Неизвестный
10.09.2006, 23:59
общий
это ответ
Здравствуйте, boot_sector!

Нужно импортировать функцию AppendMenuA.

Приложение:
import USER32,\ AppendMenu, ‘AppendMenuA‘,\
Неизвестный
11.09.2006, 09:43
общий
Попробуйте обрабатывать WM_CREATE, а не WM_INITDIALOG - вы же окно, а не диалог создаете.
Форма ответа