Куда функции возвращают значения?
BOOL MessageBeep(
UINT uType // sound type
);
Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Возвращает 1 или 0 куда-то...
HANDLE FindFirstFile(
LPCTSTR lpFileName, // pointer to name of file to search for
LPWIN32_FIND_DATA lpFindFileData // pointer to returned information
);
Return Values
If the function succeeds, the return value is a search handle used in a subsequent call to FindNextFile or FindClose.
If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.
Возвращает HANDLE - поисковый идентификатор куда-то...
А куда они их возвращают???
Всегда в регистр eax??? Или куда-то ещё???
Если куда-то в другое место - то это уже отход от стандарта (это неправильно!!!)
А функции WinAPI - все в EAX.
Цитата:
Вообще, по стандарту - в EAX.
Это я хотел сказать вообще (не только про WinAPI).
ЗЫ. Ты на асме пишешь?
MB_ICONINFORMATION equ 40h
MB_YESNO equ 4h
MB_OK equ 0
MAX_PATH equ 260
MAXDWORD equ 0FFFFFFFFh
LOWDWORD equ 0h
FILE_ATTRIBUTE_NORMAL equ 00000080h
INVALID_HANDLE_VALUE equ -1
OPEN_EXISTING equ 3
CREATE_ALWAYS equ 2
GENERIC_READ equ 80000000h
GENERIC_WRITE equ 40000000h
READ_WRITE equ 0C0000000h
MB_ICONHAND equ 10h
MB_ICONQUESTION equ 20h
MB_ICONEXCLAMATION equ 30h
MB_ICONASTERISK equ 40h
ERROR_NO_MORE_FILES equ 18
FILETIME STRUCT
dwLowDateTime DWORD ?
dwHighDateTime DWORD ?
FILETIME ENDS
WIN32_FIND_DATA STRUCT
dwFileAttributes DWORD ?
ftCreationTime FILETIME <>
ftLastAccessTime FILETIME <>
ftLastWriteTime FILETIME <>
nFileSizeHigh DWORD ?
nFileSizeLow DWORD ?
dwReserved0 DWORD ?
dwReserved1 DWORD ?
cFileName BYTE MAX_PATH dup(?)
cAlternate BYTE 14 dup(?)
WIN32_FIND_DATA ENDS
includelib kernel32.lib
extrn __imp__ExitProcess@4:dword
extrn __imp__FindFirstFileA@8:dword
extrn __imp__FindNextFileA@8:dword
extrn __imp__FindClose@4:dword
extrn __imp__CreateFileA@28:dword
extrn __imp__CloseHandle@4:dword
extrn __imp__Beep@8:dword
includelib user32.lib
extrn __imp__MessageBoxA@16:dword
extrn __imp__RegisterClassExA@4:dword
extrn __imp__MessageBeep@4:dword
ExitProcess equ __imp__ExitProcess@4
MessageBox equ __imp__MessageBoxA@16
FindFirstFile equ __imp__FindFirstFileA@8
FindNextFile equ __imp__FindNextFileA@8
FindClose equ __imp__FindClose@4
RegisterClassEx equ __imp__RegisterClassExA@4
CreateFile equ __imp__CreateFileA@28
CloseHandle equ __imp__CloseHandle@4
Beep equ __imp__Beep@8:dword
MessageBeep equ __imp__MessageBeep@4
.386
.model flat
.const
Hi db "Window!!!",0
HiHi db "Hellow World!!!",0
.data
file_name db "MyFile.txt",0
win32_data WIN32_FIND_DATA <FILE_ATTRIBUTE_NORMAL, <LOWDWORD, MAXDWORD>, <LOWDWORD, MAXDWORD>, <LOWDWORD, MAXDWORD>, MAXDWORD, LOWDWORD, 0, 0, "*.txt", "*.txt">
file_mask db "*.txt",0
.code
_start:
push offset win32_data
call RegisterClassEx
;Так правильно???
;Всегда ли нужно регистрировать структуры таким образом
;и зачем это нужно???
;P.S.
;В книжке видел... но там мало про WinAPI...
push offset win32_data
push offset file_mask
call FindFirstFile
cmp eax,INVALID_HANDLE_VALUE
je end_find
find_next_label:
push offset win32_data
push eax
call FindNextFile
cmp eax,ERROR_NO_MORE_FILES
;jne find_next_label
;ВОТ ИЗ-ЗА ЭТОЙ КОМАНДЫ ПОЧЕМУ-ТО ВОЗНИКАЕТ
;ОШИБКА, ЕСЛИ УБРАТЬ ";"!!! ХОТЯ, ВРОДЕ, Я ИХ ТУТ НЕ ВИЖУ!!!
;P.S.
;ОШИБКА ПРИ ЗАПУСКЕ, А НЕ ПРИ КОМПИЛЯЦИИ!!!
;ПОЯВЛЯЕТСЯ ОКОШКО, ГДЕ ОТПРАВЛЯЕТСЯ ОТЧЁТ to Microsoft!!!
push eax
call FindClose
end_find:
;Это я тоже упражнялся...
comment @
push 0
push FILE_ATTRIBUTE_NORMAL
push CREATE_ALWAYS
push 0
push 0
push READ_WRITE
push offset file_name
call CreateFile
push eax
call CloseHandle
@
;Почему-то просто Beep с заданием частоты и длительности писка
;не получается!!!???
push MB_ICONEXCLAMATION
call MessageBeep
push 0
call ExitProcess
end _start
BOOL MessageBeep(
UINT uType // sound type
);
Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Возвращает 1 или 0 куда-то...
HANDLE FindFirstFile(
LPCTSTR lpFileName, // pointer to name of file to search for
LPWIN32_FIND_DATA lpFindFileData // pointer to returned information
);
Return Values
If the function succeeds, the return value is a search handle used in a subsequent call to FindNextFile or FindClose.
If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.
Возвращает HANDLE - поисковый идентификатор куда-то...
А куда они их возвращают???
Всегда в регистр eax??? Или куда-то ещё???[/QUOTE]
если про файдфайл то возвращает в указатель LPWIN32_FIND_DATA lpFindFileData, там вся инфа о найденом файле
А FindNextFile - он в качестве второго параметра принимает HANDLE, возвращаемый FindFirstFile.
[QUOTE=Meatcoins]
;jne find_next_label
;ВОТ ИЗ-ЗА ЭТОЙ КОМАНДЫ ПОЧЕМУ-ТО ВОЗНИКАЕТ
;ОШИБКА, ЕСЛИ УБРАТЬ ";"!!! ХОТЯ, ВРОДЕ, Я ИХ ТУТ НЕ ВИЖУ!!!
;P.S.
;ОШИБКА ПРИ ЗАПУСКЕ, А НЕ ПРИ КОМПИЛЯЦИИ!!!
;ПОЯВЛЯЕТСЯ ОКОШКО, ГДЕ ОТПРАВЛЯЕТСЯ ОТЧЁТ to Microsoft!!!
[/QUOTE]
А как ты узнал что именно из-за этой комманды?
PS. Люди, пользуйтесь тегом CODE (в квадратных скобках).
PPS. FASM - RULEZZZ!!!
push offset win32_data
call RegisterClassEx
;Так правильно???
;Всегда ли нужно регистрировать структуры таким образом
;и зачем это нужно???
;P.S.
;В книжке видел... но там мало про WinAPI...
[/QUOTE]
RegisterClassEx - эта функция регистрирует класс окна.
ATOM RegisterClassEx(const WNDCLASSEX *lpwcx);
Ее параметр - указатель на структуру WNDCLASSEX
А для структур она не нужна!!!
Было так:
find_next_label:
push offset win32_data
push eax
call FindNextFile
cmp eax,ERROR_NO_MORE_FILES
;jne find_next_label
Но это неправильно, потому что FindNextFile возвращает ненулевое значение, если файл найден и нулевое, если не найден - это я с ERROR_NO_MORE_FILES перепутал просто! Синтаксической ошибки не было, но Windows угался на эту програмку при запуске!!!
Действительно ATOM RegisterClassEx(const WNDCLASSEX *lpwcx) не нужна - убрал её и всёравно всё работает!!!
Та же программка, но без consts и объявлений функций:
.386
.model flat
.const
win_caption db "Message...",0
.data
file_name db "MyFile.txt",0
win32_data WIN32_FIND_DATA <FILE_ATTRIBUTE_NORMAL, <LOWDWORD, MAXDWORD>, <LOWDWORD, MAXDWORD>, <LOWDWORD, MAXDWORD>, MAXDWORD, LOWDWORD, 0, 0, " ", " ">
file_mask db "*.txt",0
.data?
my_dir db 400h dup(?)
.code
_start:
push offset my_dir
push 400h
call GetCurrentDirectory
push MB_OK
push offset win_caption
push offset my_dir
push 0
call MessageBox
push offset win32_data
push offset file_mask
call FindFirstFile
cmp eax,INVALID_HANDLE_VALUE
je end_find
mov ebx,eax
find_next:
push MB_OK
push offset win32_data.cAlternate
push offset win32_data.cFileName
push 0
call MessageBox
push offset win32_data
push ebx
call FindNextFile
cmp eax,00000000h
jne find_next
push eax
call FindClose
end_find:
comment @
push 0
push FILE_ATTRIBUTE_NORMAL
push CREATE_ALWAYS
push 0
push 0
push READ_WRITE
push offset file_name
call CreateFile
push eax
call CloseHandle
@
push MB_ICONEXCLAMATION
call MessageBeep
push 0
call ExitProcess
end _start
Это как-то можно сделать, потому-что, если вызвать диспетчер задач lsass.exe, то там будет куча всяких программ. Некоторые из них "сидят" и ждут определённых событий, а при их наступлении активируются - вот и мне так надо!!!
А вообще способов создать прогу, висящую в памяти - вагон и маленькая тележка. ЛЮБОЕ оконное приложение "висит" в памяти и чего-то ждет, например пока его не прихлопнет юзер....
Можно просто создать приложение со скрытым окном чтобы оно на панели задач не было видно; можно написать системный сервис(у него вообще окна нету, типа svchost.exe)... А что за события должны отлавливаться-то, например?
Сервис пиши
Если куда-то в другое место - то это уже отход от стандарта (это неправильно!!!)
[/QUOTE]
Из какого стандарта?
Цитату из стандарта, пожалуйста!
P.S. Не морочьте людям голову.
:-)))) это общепринято. еще для передачи 64-разрядных значений используется регистровая пара EDX:EAX. если не в eax то КУДА? ;-))
Общепринято, это далеко ещё не стандарт.
А как же платформы на которых нет регистра EAX ?
А возвращаться может куда и как угодно, все зависит от специфики реализации и воображения исполнителя компилятора.
...
invoke ShowWindow,Дескриптор окна,SW_HIDE
...
и программа будет только в процессах.
...
invoke ShowWindow,Дескриптор окна,SW_HIDE
...
и программа будет только в процессах.[/QUOTE]
Попробую этот вариант...обязательно...
[QUOTE=Шпиёна]Можно просто создать приложение со скрытым окном чтобы оно на панели задач не было видно; можно написать системный сервис(у него вообще окна нету, типа svchost.exe)... А что за события должны отлавливаться-то, например?[/QUOTE]
Какие события? Ну, например, вначале мне хотелось бы перехватить hot key combination - нажимаю, например, ctrl+alt+F3 и появляется окошко моей программы. А ещё перехват событий нажатия определённых клавиш... Много чего придумать можно...
А как сервис написать???
Вот она:
MB_ICONEXCLAMATION equ 30h
includelib kernel32.lib
extrn __imp__ExitProcess@4:dword
extrn __imp__Beep@8:dword
includelib user32.lib
extrn __imp__MessageBeep@4:dword
ExitProcess equ __imp__ExitProcess@4
Beep equ __imp__Beep@8
MessageBeep equ __imp__MessageBeep@4
.386
.model flat
.code
_start:
;Тут мы не обязательно будем только гудеть,
;если мы не создаём никаких окон, то и
;отображаться они нигде не будут, а
;если мы захотим сделать окно, то мы можем
;присвоить ему параметр SW_HIDE и эффект
;будет по идее такой же!
push 1000h
push 100h
call Beep
;Тут я долго гудел, чтобы убедиться, что
;програма появляется в диспетчере задач
;и не появляется на панели задач!
push MB_ICONEXCLAMATION
call MessageBeep
push 0
call ExitProcess
;А можно и не завершаться сразу, а следить
;за событиями, например!
end _start
А как же платформы на которых нет регистра EAX ?
А возвращаться может куда и как угодно, все зависит от специфики реализации и воображения исполнителя компилятора.[/QUOTE]
Ты не прав. Есть такое понятие - ABI. Application Binary Interface. И это стандарт, пусть даже если он и неофициальный. x86 ABI говорит, что значение возвращается в EAX. Куда угодно и как угодно возвращаться не может, ибо тогда библиотеку, созданную в одном компиляторе, нельзя будет использовать с другим компилятором.
На платформах, где нет регистра EAX, есть другие регистры, и ABI там соответственно другой. :cool: Например d0 на m68k и r0 на PPC.