Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Куда функции возвращают значения?

367
09 августа 2006 года
Meatcoins
303 / / 18.01.2006
Например:

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??? Или куда-то ещё???
334
09 августа 2006 года
HexEdit
809 / / 27.07.2006
Вообще, по стандарту - в EAX.
Если куда-то в другое место - то это уже отход от стандарта (это неправильно!!!)

А функции WinAPI - все в EAX.
334
09 августа 2006 года
HexEdit
809 / / 27.07.2006
Цитата:
Вообще, по стандарту - в EAX.



Это я хотел сказать вообще (не только про WinAPI).

ЗЫ. Ты на асме пишешь?

367
09 августа 2006 года
Meatcoins
303 / / 18.01.2006
Пробую найти файл MyFile.txt! Ерунда, конечно, но что-то не получается...



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
6.8K
09 августа 2006 года
Romikgy
84 / / 28.04.2005
[QUOTE=Meatcoins]Например:

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, там вся инфа о найденом файле
334
09 августа 2006 года
HexEdit
809 / / 27.07.2006
[QUOTE=Romikgy]если про файдфайл то возвращает в указатель LPWIN32_FIND_DATA lpFindFileData, там вся инфа о найденом файле[/QUOTE]
А FindNextFile - он в качестве второго параметра принимает HANDLE, возвращаемый FindFirstFile.

[QUOTE=Meatcoins]
;jne find_next_label
;ВОТ ИЗ-ЗА ЭТОЙ КОМАНДЫ ПОЧЕМУ-ТО ВОЗНИКАЕТ
;ОШИБКА, ЕСЛИ УБРАТЬ ";"!!! ХОТЯ, ВРОДЕ, Я ИХ ТУТ НЕ ВИЖУ!!!
;P.S.
;ОШИБКА ПРИ ЗАПУСКЕ, А НЕ ПРИ КОМПИЛЯЦИИ!!!
;ПОЯВЛЯЕТСЯ ОКОШКО, ГДЕ ОТПРАВЛЯЕТСЯ ОТЧЁТ to Microsoft!!!
[/QUOTE]
А как ты узнал что именно из-за этой комманды?

PS. Люди, пользуйтесь тегом CODE (в квадратных скобках).
PPS. FASM - RULEZZZ!!!
334
09 августа 2006 года
HexEdit
809 / / 27.07.2006
[QUOTE=Meatcoins]
push offset win32_data
call RegisterClassEx
;Так правильно???
;Всегда ли нужно регистрировать структуры таким образом
;и зачем это нужно???
;P.S.
;В книжке видел... но там мало про WinAPI...
[/QUOTE]

RegisterClassEx - эта функция регистрирует класс окна.
ATOM RegisterClassEx(const WNDCLASSEX *lpwcx);
Ее параметр - указатель на структуру WNDCLASSEX
А для структур она не нужна!!!
367
09 августа 2006 года
Meatcoins
303 / / 18.01.2006
Спасибо всем за советы!

Было так:

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
367
09 августа 2006 года
Meatcoins
303 / / 18.01.2006
Как сделать программку резидентной под Windows с помощью функций WinAPI, чтобы она не отображалась в панели задач (правее от кнопочки Пуск в Windows)??? Это надо, например, для того, чтобы отслеживать какие-либо процессы в системе.
Это как-то можно сделать, потому-что, если вызвать диспетчер задач lsass.exe, то там будет куча всяких программ. Некоторые из них "сидят" и ждут определённых событий, а при их наступлении активируются - вот и мне так надо!!!
354
09 августа 2006 года
ШпиЁн
468 / / 19.02.2006
Э-э-э... lsass.exe это другое :-))

А вообще способов создать прогу, висящую в памяти - вагон и маленькая тележка. ЛЮБОЕ оконное приложение "висит" в памяти и чего-то ждет, например пока его не прихлопнет юзер....

Можно просто создать приложение со скрытым окном чтобы оно на панели задач не было видно; можно написать системный сервис(у него вообще окна нету, типа svchost.exe)... А что за события должны отлавливаться-то, например?
6.8K
09 августа 2006 года
Romikgy
84 / / 28.04.2005
Сервис пиши
3
09 августа 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=HexEdit]Вообще, по стандарту - в EAX.
Если куда-то в другое место - то это уже отход от стандарта (это неправильно!!!)
[/QUOTE]
Из какого стандарта?
Цитату из стандарта, пожалуйста!

P.S. Не морочьте людям голову.
354
09 августа 2006 года
ШпиЁн
468 / / 19.02.2006
:-)))) это общепринято. еще для передачи 64-разрядных значений используется регистровая пара EDX:EAX. если не в eax то КУДА? ;-))
3
10 августа 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=ШпиЁн]:-)))) это общепринято. еще для передачи 64-разрядных значений используется регистровая пара EDX:EAX. если не в eax то КУДА? ;-))[/QUOTE]
Общепринято, это далеко ещё не стандарт.
А как же платформы на которых нет регистра EAX ?
А возвращаться может куда и как угодно, все зависит от специфики реализации и воображения исполнителя компилятора.
6.6K
10 августа 2006 года
Scaiman
126 / / 25.07.2006
Можно сделать вот так
...
invoke ShowWindow,Дескриптор окна,SW_HIDE
...
и программа будет только в процессах.
367
10 августа 2006 года
Meatcoins
303 / / 18.01.2006
[QUOTE=Scaiman]Можно сделать вот так
...
invoke ShowWindow,Дескриптор окна,SW_HIDE
...
и программа будет только в процессах.[/QUOTE]

Попробую этот вариант...обязательно...

[QUOTE=Шпиёна]Можно просто создать приложение со скрытым окном чтобы оно на панели задач не было видно; можно написать системный сервис(у него вообще окна нету, типа svchost.exe)... А что за события должны отлавливаться-то, например?[/QUOTE]

Какие события? Ну, например, вначале мне хотелось бы перехватить hot key combination - нажимаю, например, ctrl+alt+F3 и появляется окошко моей программы. А ещё перехват событий нажатия определённых клавиш... Много чего придумать можно...
А как сервис написать???
367
10 августа 2006 года
Meatcoins
303 / / 18.01.2006
Пришла в голову гениальная мысль!
Вот она:


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
10K
10 августа 2006 года
Sonic_amiga
34 / / 19.06.2006
[QUOTE=Green]Общепринято, это далеко ещё не стандарт.
А как же платформы на которых нет регистра EAX ?
А возвращаться может куда и как угодно, все зависит от специфики реализации и воображения исполнителя компилятора.[/QUOTE]

Ты не прав. Есть такое понятие - ABI. Application Binary Interface. И это стандарт, пусть даже если он и неофициальный. x86 ABI говорит, что значение возвращается в EAX. Куда угодно и как угодно возвращаться не может, ибо тогда библиотеку, созданную в одном компиляторе, нельзя будет использовать с другим компилятором.
На платформах, где нет регистра EAX, есть другие регистры, и ABI там соответственно другой. :cool: Например d0 на m68k и r0 на PPC.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог