Описание функции | |
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 |
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 |
Возвращаемое значение
Успех: | @error = 0. | |
Ошибка: | Устанавливает @error | |
@error: | 1 - невозможно использовать файл DLL, | |
2 неизвестный возвращаемый тип (return type). | ||
3 функция не найдена в файле DLL. | ||
4 неверное количество параметров. | ||
5 неверный параметр. |
Примечания
Если используется имя/путь dll, то DLL автоматически загружается и выгружается в конце вызова. Если вы хотите вручную контролировать загрузку и выгрузку DLL, тогда используйте функции DllOpen и DllClose и возвращаемый дескриптор вместо имя/путь dll в этой функции.DllCall('SQLite.dll','int:cdecl','sqlite3_open','str',$sDatabase_Filename, 'long*',0)
См. также
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]?'Каталог':'Файл')) ;; определяет, является ли указанный путь каталогом или файлом