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


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

Функцию можно подключить через команду exect
Для передачи NULL указателя можно воспользоваться ключевым словом Null

См. также

DllOpen, DllClose, DllStructCreate, DllStructGetPtr

Примеры:
 Как создать кнопку?


exect=$var_i=DllCall('user32.dll','int','GetSystemMetrics','int',4)||_ViewValues($var_i) ;; получить высоту заголовка окна

exect=$var_hdll=DllOpen('user32.dll')||$var_res=DllCall($var_hdll,'int','MessageBox','hwnd',0,'str','Текст','str','Заголовок','int',0)||$var_hdll=DllClose(($var_hdll)||_ViewValues($var_res) ;; пример вызова с помощью DLL

exect=$var_0=Assign('STRUCT_1',DllStructCreate('dword~~Size;hwnd~~hWndOwnder;handle~~hInstance;dword~~rgbResult;ptr~~CustColors;dword~~Flags;lparam~~lCustData;ptr~~lpfnHook;ptr~~lpTemplateName'),2)+Assign('STRUCT_2',DllStructCreate('dword[16]'),2)+DllStructSetData($STRUCT_1,'Size',DllStructGetSize($STRUCT_1))+DllStructSetData($STRUCT_1,'hWndOwnder',GUICreate(0,200,300,-1,-1))+DllStructSetData($STRUCT_1,'rgbResult','0xC5B248')+DllStructSetData($STRUCT_1,'CustColors',DllStructGetPtr($STRUCT_2))+DllStructSetData($STRUCT_1,'Flags',259)||$var_iyn=DllCall('comdlg32.dll','bool','ChooseColor','struct*',$STRUCT_1)[0]||$var_0=$var_iyn=0?_Exit():1||$var_num=DllStructGetData($STRUCT_1,'rgbResult')||$var_ibrg=Hex($var_num,6)||_ViewValues('$var_ibrg','BRG~~Color') ;; создание и запуск окна выбора цвета

exect=$var_handle=WinGetHandle('[CLASS:TTOTAL_CMD]')||$var_0=Assign('STRUCT_RECT',DllStructCreate(':tagRECT:'),2)+DllCall('user32.dll','bool','GetWindowRect','hwnd',Eval('var_handle'),'struct*',$STRUCT_RECT)||$var_s='Координаты~~углов~~TC:'&@CRLF&'X1:~~'&DllStructGetData($STRUCT_RECT,'Left')&@CRLF&'X2:~~'&DllStructGetData($STRUCT_RECT,'Right')&@CRLF&'Y1:~~'&DllStructGetData($STRUCT_RECT,'Top')&@CRLF&'Y2:~~'&DllStructGetData($STRUCT_RECT,'Bottom')||_ViewValues('$var_s') ;; получение координат окна Total Commander

exect=$var_h=DllCall('user32.dll','hwnd','GetDesktopWindow')[0]||_ViewValues('16:~~'&'$var_h'&@CRLF&'10:~~'&$var_h,'Дескриптор~~окна~~рабочего~~стола') ;; получить дескриптор окна рабочего стола

exect=$var_0=Assign('STRUCT_ICON',DllStructCreate('int'),2)+Assign('STRUCT_STRING',DllStructCreate('wchar[260]'),2)+DllStructSetData($STRUCT_STRING,1,@SystemDir&'\shell32.dll')||$var_iyn=DllCall('shell32.dll','int',62,'hwnd',GUICreate(0,400,400,-1,-1),'struct*',$STRUCT_STRING,'int',DllStructGetSize($STRUCT_STRING)/2,'struct*',$STRUCT_ICON)[0]||$var_0=$var_iyn=0?_Exit():1||$var_s=DllStructGetData($STRUCT_STRING,1)&','&DllStructGetData($STRUCT_ICON,1)||_ViewValues('$var_s','Путь~~и~~номер~~значка') ;; выбор значка в системном диалоге

exect=$var_htc=WinGetHandle('[CLASS:TTOTAL_CMD]')||_ViewValues('$var_htc') exect=$var_hss=DllCall('user32.dll','handle','SendMessage','hwnd',$var_htc,'uint',1074,'wparam',7,'lparam',0)[0]||_ViewValues('$var_hss') exect=$var_sss=DllCall('user32.dll','int','GetWindowTextW','hwnd',$var_hss,'wstr','''','int',4096)[2]||_ViewValues('$var_sss') ;; получить текст строки состояния левой файловой панели Total Commander

exect=$var_a=DllCall('shell32.dll','int','PickIconDlg','hwnd',0,'wstr',@SystemDir&'\User32.dll','int',1000,'int*',0)||_ViewValues($var_a) ;; пример вызова системного диалога выбора значка из заданной библиотеки значков

exect=$var_a=DllCall('shell32.dll','int','PickIconDlg','hwnd',WinGetHandle('[ACTIVE]'),'wstr',@SystemDir&'\User32.dll','int',1000,'int*',0)||_ViewValues($var_a) ;; пример вызова системного диалога выбора значка из заданной библиотеки значков

exect=DllCall('shell32.dll','int','ShellAbout','hwnd',0,'str','xxx','str','zzz','ptr',0) ;; пример вызова системного диалога "О программе"

exect=DllCall('shell32.dll','long','SHEmptyRecycleBinW','hwnd',0,'wstr','''','dword',0) ;; пример вызова диалога очистки корзины

exect=DllCall('shell32.dll','long','SHEmptyRecycleBinW','hwnd',0,'wstr',Null,'dword',0) ;; пример вызова диалога очистки корзины

exect=DllCall('user32.dll','int','MessageBoxW','hwnd',0,'wstr','ERROR','wstr',Null,'dword',4096) ;; пример сообщения с ошибкой

exect=$var_time=StringStripWS(DllCall('shlwapi.dll','int','StrFromTimeIntervalW','wstr','''','uint',1024,'dword',TimerDiff(0),'int',7)[1],3) GLOBALEXECT<a> ;; получить время работы компьютера в формате: часы, минуты, секунды

exect=_ViewValues(StringStripWS(DllCall('shlwapi.dll','int','StrFromTimeIntervalW','wstr','''','uint',1024,'dword',TimerDiff(0),'int',7)[1],3)) ;; получить время работы компьютера в формате: часы, минуты, секунды

exect=DllCall('kernel32.dll','int','Beep','dword',500,'dword',1000) ;; пример воспроизведения простого однотонного звука

exect=DllCall('shell32.dll','int','ShellAboutW','hwnd',0,'wstr','TITLE#NAME','wstr','TEXT') ;; запуск диалога "O Windows"

exect=DllCall('user32.dll','bool','SystemParametersInfoW','uint',93,'uint',7,'struct*',0,'uint',0)||Sleep(5000)||DllCall('user32.dll','bool','SystemParametersInfoW','uint',93,'uint',0,'struct*',0,'uint',0) ;; включить след от указателя мыши на 5 секунд

exect=$var_0=Assign('STRUCT_1',DllStructCreate('wchar[256]'),2)+DllCall('Kernel32.dll','uint','GetTempFileNameW','wstr',@TempDir,'wstr','__','uint',0,'ptr',DllStructGetPtr($STRUCT_1))||$var_path=DllStructGetData($STRUCT_1,1)||_ViewValues('$var_path','temp_file') ;; получить временный файл

exect=$var_path=DllCall('kernel32.dll','uint','GetTempFileNameW','wstr','C:\','wstr','_','uint',0,'wstr','''')||_ViewValues($var_path[4],'temp_file') ;; получить временный файл

exect=$var_puser=DllCall('userenv.dll','bool','GetProfilesDirectoryW','wstr','''','dword*',4096)||_ViewValues($var_puser[1],'user_path') ;; получить папку пользователя

exect=DllCall('kernel32.dll','boolean','CreateSymbolicLinkW','wstr','%T%N','wstr','%P%N','dword',0) tcimg=$cm4006|540 ;; для файла под курсором создать именную символическую ссылку в другой панели

exect=DllCall('kernel32.dll','boolean','CreateSymbolicLinkW','wstr','%T%N','wstr','%P%N','dword',1) tcimg=$cm4006|540 ;; для папки под курсором создать именную символическую ссылку в другой панели

exect=DllCall('kernel32.dll','boolean','CreateSymbolicLinkW','wstr','"%P"xxx\','wstr','C:\','dword',1) tcimg=$cm540 ;; для диска C:\ создать символическую ссылку в активной панели именем "xxx"

exect=$var_i=(StringInStr(FileGetAttrib('%P%N'),'D')~~AND~~FileExists('%P%N'))?1:0||exect=DllCall('kernel32.dll','boolean','CreateSymbolicLinkW','wstr','%T%N','wstr','%P%N','dword',$var_i) tcimg=$cm4006|540 ;; для объекта под курсором создать именную символическую ссылку в другой панели

exect=DllCall('kernel32.dll','bool','CreateHardLinkW','wstr','%T%N','wstr','%P%N','ptr',0) tcimg=$cm4006|540 ;; для файла под курсором создать именную жёсткую ссылку в другой панели (в рамках одного диска)

exect=MsgBox(4096,'Сообщение','Файл_под_курсором_защищён_системой?~~'&(DllCall('sfc.dll','bool','SfcIsFileProtected','handle',0,'wstr','%P%N')[0]=0?'No':'Yes')) ;; проверить защищён ли файл под курсором и выдать сообщение

exect=DllCall('kernel32.dll','int','SetFileAttributesW','wstr','%P%N','dword',2+4) tcimg=$cm540 ;; установить объекту под курсором атрибут "скрытый" (2) и "системный" (4) ("архивный" (32), "только для чтения" (1), "снять все атрибуты" (128))

exect=MsgBox(4096,'Сообщение','Каталог_под_курсором_пустой?~~'&(DllCall('shlwapi.dll','bool','PathIsDirectoryEmptyW','wstr','%P%N')[0]?'Yes':'No')) ;; определяет, является ли указанный путь пустым каталогом

exect=DllCall('kernel32.dll','dword','GetFileAttributesW','wstr','%P%N')[0] GLOBALEXECT<a> ;; получить флаги атрибутов объекта под курсором

exect=DllCall('kernel32.dll','dword','GetCurrentDirectoryW','dword',4096,'wstr','''')[2] GLOBALEXECT<a> ;; возвращает путь текущего каталога

exect=DllCall('kernel32.dll','bool','CreateDirectoryExW','wstr','"%P"','wstr','xxx','struct*',0) tcimg=$cm540 ;; в активной панели создать каталог "xxx"

exect=DllCall('kernel32.dll','handle','CreateFileW','wstr','"%P"test.txt','dword',0,'dword',0,'struct*',0,'dword',1,'dword',0,'handle',0) tcimg=$cm540 ;; в активной панели создать файл test.txt

exect=DllCall('kernel32.dll','bool','CreateDirectoryW','wstr','"%P"zzz','struct*',0) tcimg=$cm540 ;; в активной панели создать каталог "zzz"

exect=DllCall('kernel32.dll','bool','CopyFileExW','wstr','%P%N','wstr','%T%N','ptr',0,'struct*',0,'bool*',0,'dword',0) tcimg=$cm4006|540 ;; копировать файл под курсором в другую панель

exect=MsgBox(4096,'Сообщение','Под_курсором_каталог_или_файл?~~'&(DllCall('shlwapi.dll','bool','PathIsDirectoryW','wstr','%P%N')[0]?'Каталог':'Файл')) ;; определяет, является ли указанный путь каталогом или файлом


© Аверин Андрей для Total Commander Image  Averin-And@yandex.ru