Добрый день. Подскажите в чем ошибка Код (Text): format PE GUI 4.0 entry start include 'c:\fasmw\include\win32a.inc' section '.code' code readable writeable executable dllname db 'ws2_32.DLL',0 ;dllname db 'c:\WINNT\system32\ws2_32.dll', 0 start: push dllname call [LoadLibrary] ; - GetLastError постоянно = ERROR_INVALID_HANDLE (00000006) int 3 ret section '.idata' import data readable writeable library kernel32, 'kernel32.dll',\ user32, 'user32.dll';,\ include 'C:\fasmw\INCLUDE\APIA\kernel32.inc' include 'C:\fasmw\INCLUDE\APIA\USER32.INC' Что делать?
Код (Text): format PE GUI 4.0 include 'E:\FASM\Include\win32a.inc' invoke LoadLibrary,libname ; Тут ставим бряк и смотрим - в EAX адрес загруженной либы invoke ExitProcess,0 libname db 'D:\WINNT\system32\appmgr.dll',0 data import library kernel32,'KERNEL32.DLL' import kernel32,\ ExitProcess,'ExitProcess',\ LoadLibrary,'LoadLibraryA' end data Да, и как уже сказал cpp_and_wasm, int 3 привилегированная инструкция, ее нужно убрать из программы, если она не отлаживается...
действительно так и есть - программа отрабатывает - выдается ошибка ERROR_INVALID_HANDLE (00000006) - И после всего этого в eax мы наблюдаем правильный адрес загрузки ws2_32.DLL = 74FC0000 Парадокс! Вывод - не верить GetLastError() ?
Ну почему же, с точки зрения системы 74FC0000 действительно какой-то левый хендл, другое дело, что LoadLibrary возврашает не хендл а HMODULE.
GetLastError() проверяется только если API возвращает ошибку. В твоём случае назад приходит нормальный HANDLE. Если API работает - не надо обращать внимания на GetLastError().
Еще раз повторю слова n0name - LoadLibrary возвращает не хэндл, а HMODULE, т.е. тот адрес, куда была загружена DLL. Но вот только не знаю, приведенный мной код отрабатывает нормально, и GetLastError говорит ERROR_SUCSESS...
Цитата из MSDN: "If the function succeeds, the return value is a handle to the module. If the function fails, the return value is NULL. To get extended error information, call GetLastError." Разницы нет: HANDLE это или HMODULE. Если получен назад не NULL, значит не надо смотреть на GetLastError().
AsmGuru62 Разница есть при STRICT, да и HMODULE не вставишь в CloseHandle. Да и по реализации: хэндл - это всего лишь дескриптор, а HMODULE всё же по сути адрес модуля.