Функция DllCall

         Описание функции


DllCall

Вызывает функцию из DLL.

DllCall ( "dll", "return type", "function" [, type1, param1 [, type n, param n ]] )

Параметры

dll Имя файла DLL, например используйте "user32.dll". Также можно использовать указатель полученный от DllOpen() (смотрите примечания).
return type Тип возвращаемого значения функции (смотрите ниже).
function Имя функции вызываемой из DLL, например "MessageBox" или её порядковый номер, например 62.
type1 [необязательный] Тип параметра (смотрите примечания).
param1 [необязательный] Значение параметра (смотрите примечания).
type n [необязательный] Тип n-ого параметра (смотрите примечания).
param n [необязательный] Значение n-ого параметра (смотрите примечания).


Допустимые типы:

Тип Описание
none нет значения (только для возвращения типа параметра - эквивалентно void в C)
BYTE беззнаковое 8 битное целое
BOOLEAN беззнаковое 8 битное целое
short 16 битное целое
USHORT беззнаковое 16 битное целое
WORD беззнаковое 16 битное целое
int 32 битное целое
long 32 битное целое
BOOL 32 битное целое
UINT беззнаковое 32 битное целое
ULONG беззнаковое 32 битное целое
DWORD беззнаковое 32 битное целое
INT64 64 битное целое
UINT64 беззнаковое 64 битное целое
ptr общий указатель (void *)
HWND дескриптор окна (pointer)
HANDLE дескриптор (pointer)
float число одинарной точности с плавающей точкой
double число двойной точности с плавающей точкой
INT_PTR, LONG_PTR, LRESULT, LPARAM большое целое число, достаточное для хранения указателя при запуске x86 или x64 версии AutoIt.
UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM беззнаковое большое целое число, достаточное для хранения указателя при запуске x86 или x64 версии AutoIt.
str ANSI строка (минимум выделяется 65536 символа).
wstr UNICODE широкий символ строки (минимум выделяется 65536 символа).
struct Структура созданная функцией DllStructCreate()
* Добавьте * в конце другого типа, чтобы передать его ссылкой. Например "int*" передает указатель на тип "int".



Преобразование типов "Windows API" в тип AutoIt:

Типы в WINDOWS API Типы в AutoIt
LPCSTR/LPSTR str
LPCWSTR/LPWSTR wstr
LPVOID ptr
LPxyz xyz*
HINSTANCE handle
HRESULT long
LONGLONG/LARGE_INTEGER INT64
ULONGLONG/ULARGE_INTEGER UINT64
SIZE_T ULONG_PTR

Для использования вложенных структур внутри структуры необходимо заново определить вложенную структуру. Например, структура, содержащая две POINT структуры ("long;long") должна быть объявлена как "long;long;long;long". Первые два long значения соответствуют первой POINT структуре, а вторые два значения соответствуют второй POINT структуре.

Подробности типов "Windows API" смотрите MSDN.

Возвращаемое значение

Успех:@error = 0.
Ошибка:Устанавливает @error
@error:1 - невозможно использовать файл DLL,
2 неизвестный возвращаемый тип (return type).
3 функция не найдена в файле DLL.
4 неверное количество параметров.
5 неверный параметр.
Смотрите примечания.

Примечания

Если используется имя/путь dll, то DLL автоматически загружается и выгружается в конце вызова. Если вы хотите вручную контролировать загрузку и выгрузку DLL, тогда используйте функции DllOpen и DllClose и возвращаемый дескриптор вместо имя/путь dll в этой функции.

По умолчанию, AutoIt использует метод вызова 'stdcall'. Для использования метода 'cdecl' вставьте ':cdecl' после возвращаемого типа.

DllCall("SQLite.dll", "int:cdecl", "sqlite3_open", "str", $sDatabase_Filename , "long*", 0)


По умолчанию, AutoIt пытается использовать ANSI версию имени функции, т. е. MessageBoxA, когда в имени указана функция MessageBox. Для вызова Unicode версии используйте MessageBoxW.

Если вызов функции вызвал сбой, то @error устанавливается в 1. Иначе возвращается массив, который содержит возвращаемое функцией значение и копирует все параметры (включая параметры, которые функция может изменить при передаче ссылок).
$return[0] = возвращаемое значение функции
$return[1] = параметр_1
$return[2] = параметр_2
...
$return[n] = параметр_n

См. также

DllCallbackFree, DllCallbackGetPtr, DllCallbackRegister, DllOpen, DllClose, DllStructCreate, DllStructGetPtr

Пример

; Пример 1 - вызов непосредственно MessageBox API
$result = DllCall("user32.dll", "int", "MessageBox", "hwnd", 0, "str", "Некоторый текст", "str", "Такой вот заголовок", "int", 0)



; Пример 2 - вызов функции, которая запрашивает параметры (запустите блокнот)
$hwnd = WinGetHandle("[CLASS:Notepad]")
$result = DllCall("user32.dll", "int", "GetWindowText", "hwnd", $hwnd, "str", "", "int", 32768)
MsgBox(4096, "", _
        $result[0] & @LF & _ ; количество возвращаемых символов
        $result[2]) ; текст заголовка возвращаемый в параметре 2



; Пример 3 - Отображает окно выбора иконок PickIconDlg
$sFileName = @SystemDir & '\shell32.dll'

; Создаёт структуру для хранения индекса иконки
$stIcon = DllStructCreate("int")
$stString = DllStructCreate("wchar[260]")
$structsize = DllStructGetSize($stString) / 2
DllStructSetData($stString, 1, $sFileName)

; Вызывает функцию PickIconDlg из shell32.dll с порядковым номером 62 для этой функции
$aRes = DllCall("shell32.dll", "int", 62, "hwnd", 0, "ptr", DllStructGetPtr($stString), "int", $structsize, "ptr", DllStructGetPtr($stIcon))
If @error Or Not $aRes[0] Then Exit ; Выход в случае нажатия кнопки "Отмена"

$sFileName = DllStructGetData($stString, 1)
$nIconIndex = DllStructGetData($stIcon, 1)

; Отображает выбранные имя файла и номер иконки
MsgBox(4096, "Информация", "Последний выбранный файл: " & $sFileName & @LF & "Индекс иконки: " & $nIconIndex)