Вы можете задать любой вопрос по программе Autohotkey в нашей группе Вконтакте. Если решение требует более высокой квалификации- можно обратиться непосредственно ко мне.
Группа Вконтакте | Электронная почта | Симаков Яков ВК |
Вызывает функцию в DLL, например, стандартную функцию API Windows.
Result | Фактическое значение, возвращенное функцией. Если функция не возвращает значения, результат - неопределенное целое число. Если функция вызвала ошибку, возвращаемое значение - пустая строка. |
[DllFile\]Function |
Имя файла DLL, после которого идет обратный слеш и название (имя) функции. Например: "MyDLL\MyFunction" (расширение файла ".dll" является необязательным). Если абсолютный путь не определен, DllFile разыскивается в PATH системы или в текущем рабочем каталоге сценария (см. описание встроенной переменной A_WorkingDir). DllFile может быть опущен при вызове функции, которая находится в User32.dll, Kernel32.dll или ComCtl32.dll (или Gdi32.dll для версий, начиная с 1.0.36.07). Например, "User32\IsWindowVisible" приведет к тому же самому результату, что и "IsWindowVisible". Для таких стандартных DLL символ "A" (суффикс, который появляется у некоторых функций API), также может быть опущен. Например, "MessageBox" - то же самое, что и "MessageBoxA". Производительность может быть значительно улучшена при использовании повторных запросов к заранее загруженным DLL (с помощью "Kernel32.dll\LoadLibrary", подробнее об этом см. ниже). |
Type1, Arg1 |
Каждая из этих пар представляет отдельный параметр, который будет передан функции. Количество пар не ограничено. Type - см. таблицу типов ниже. Arg - значение, которое будет передано функции. |
Cdecl ReturnType |
Слово "Cdecl" обычно опускается, потому что большинство функций использует стандартное соглашение о вызовах, а не "C-соглашение" о вызовах (функции вроде wsprintf, которые принимают изменяющееся количество параметров - одно из исключений). Если вы опускаете "Cdecl", но вызов приводит к тому, что встроенная переменная ErrorLevel принимает значение "An", где n - полный размер параметров, которые вы передали, это может означать, что слово "Cdecl" все же требуется (подробнее о значениях ErrorLevel см. ниже). Если слово "Cdecl" используется, то оно должно находиться перед указанием типа возвращаемого значения (ReturnType). Отделите слова друг от друга символом пробела или табуляции. Например: "Cdecl Str". ReturnType: если функция возвращает 32-разрядное целое число (Int), BOOL, или вообще ничего, ReturnType может быть опущен. Иначе, определите тип, пользуясь таблицей типов ниже. Суффикс "звездочка" (*) также поддерживается. |
Тип | Описание |
---|---|
Str |
Строка типа "Blue" или MyVar. Если вызванная функция изменяет строку, и параметр - явная переменная, ее содержание будет модифицировано. Например, следующий вызов преобразовал бы содержание MyVar к верхнему регистру: DllCall ("CharUpper", "str", MyVar). Однако, если функция разработана так, что работает со строкой большей, чем текущая "вместимость" переменной, перед вызовом функции необходимо убедиться, что переменная является достаточно "большой". Это может быть достигнуто с помощью вызова VarSetCapacity (MyVar, 123), где 123 - количество байт, которое должна быть способна вместить переменная MyVar. Параметр типа str не должен быть выражением, которое возвращает число. Если это так, функция не будет вызвана, а встроенная переменная ErrorLevel будет установлена на -2. Вообще, тип str должен использоваться с функциями, которые ожидают LPSTR, LPCSTR, LPTSTR и подобные типы. Звездочка "str * " поддерживается, но очень редко используется. Это может использоваться с функциями, которые ожидают что-то подобное "char ** " или "LPSTR * ". |
Int64 | 64-разрядное целое число. |
Int |
32-разрядное целое число, которое является самым обычным целочисленным типом (иногда называемым "LONG"). Этот тип должен также использоваться для любого параметра типа BOOL, ожидаемого функцией (значение типа BOOL должно быть 1 или 0). Также весьма часто используется беззнаковый Int (UInt), например, для DWORD, COLORREF и различных дескрипторов типа HWND, HBRUSH и HBITMAP. |
Short |
16-разрядное целое число. Беззнаковый Short (UShort) может использоваться с функциями, которые ожидают WORD. |
Char |
8-разрядное целое число. Беззнаковый Char (UChar) может использоваться с функциями, которые ожидают BYTE. |
Float |
32-разрядное число с плавающей запятой, которое обеспечивает 6 цифр точности. |
Double |
64-разрядное число с плавающей запятой, которое обеспечивает 15 цифр точности. |
* или P (суффикс) |
Добавьте в конец звездочку (с дополнительным предыдущим пробелом) к любому из вышеупомянутых типов, чтобы передать адрес параметра, а не само значение (вызываемая функция должна специально требовать этого). Так как значение такого параметра может быть изменено функцией, всякий раз, когда явную переменную передают как параметр, содержание такой переменной будет обновлено. Например, следующий вызов передает текущее содержание переменной MyVar функции MyFunc и также обновляет переменную MyVar, чтобы отразить любые изменения, сделанные функцией MyFunc: DllCall ("MyDll\MyFunc", " int * ", MyVar). Вообще, звездочка используется всегда, когда функция имеет тип параметра или тип возвращаемого значения, который начинается с "LP" (кроме строки типа LPSTR, для которой нужно использовать "str"). Самый обычный пример - LPDWORD, который является указателем на DWORD. Так как DWORD - 32-разрядное целое число без знака, используйте "UInt * ", чтобы представить LPDWORD. Обратите внимание, что "char * " - не то же самое, что "str", потому что "char * " передает адрес 8-битного числа, а "str" передает адрес последовательности символов. |
U (префикс) |
Прибавьте символ U к любому из целочисленных типов выше, чтобы интерпретировать его как целое число без знака (UInt64, UInt, UShort и UChar). Строго говоря, это необходимо только для возвращаемых значений и типов со звездочкой, потому что не имеет значения, содержит ли параметр знак, если он передан по значению (исключая Int64). 32-разрядное целое число без знака (UInt) соответствует любому DWORD, HWND или подобному параметру, ожидаемому функцией. Кроме того, значение HWND (дескриптор окна) - то же самое, что и уникальный идентификатор окна (см. описание функции WinGet). Если в качестве беззнакового параметра определено отрицательное целое число, целое число будет преобразовано в беззнаковое. Например, если -1 посылается как UInt, она превратится в 0xFFFFFFFF. Однако, эта методика не поддерживается для 64-разрядного целого (UInt64). 64-разрядные целые числа без знака в полной мере не поддерживаются. Поэтому, чтобы работать с числами, большими или равными 0x8000000000000000, опустите префикс U и интерпретируйте любые отрицательные значения, полученные от функции, как большие целые числа. Например, функция, которая выдает -1 как Int64, в действительности возвращает 0xFFFFFFFFFFFFFFFF, если она должна выдавать UInt64. |
Встроенная переменная ErrorLevel устанавливается на одно из следующих значений, чтобы указать, потерпел ли вызов неудачу или выполнен успешно.
0: успешно.
-1 (минус единица): параметр [DllFile\]Function - выражение, которое возвращает число. Требуется строка.
-2: тип возвращаемого значения или один из указанных типов параметров недопустимы. Такая ошибка может также возникнуть, если в качестве параметра типа str передано выражение, возвращающее число.
-3: невозможно обратиться к указанному DllFile. Если для DllFile не был определен абсолютный путь, файл должен существовать в PATH системы или в текущем рабочем каталоге сценария (переменная A_WorkingDir). Эта ошибка также может произойти, если у пользователя недостаточно прав для получения доступа к файлу.
-4: указанная функция не найдена в DLL.
N (любое положительное число): функция вызвана, но произошла фатальная ошибка (исключение) N (например, 0xC0000005 означает "нарушение прав доступа"). В таких случаях функция возвращает пустое значение (пустая строка), но любые переменные со звездочками будут обновлены. Пример фатального исключения: разыменование недопустимого указателя, такого, как NULL. Так как функция Cdecl никогда не вызывает ошибку, которая описана абзацем ниже, возможно возникновение исключения, когда передано слишком мало параметров.
An (символ А, сопровождаемый целым числом n): функция вызвана, но передано слишком много или слишком мало параметров. "n" - количество байтов, на которое список параметров был превышен или занижен. Если n положительное, передано слишком много параметров (или параметры слишком большие) или запрос требует CDecl. Если n отрицательное, передано слишком мало параметров. Эта ситуация должна быть исправлена, чтобы гарантировать надежную работу функции. Присутствие этой ошибки также может означать, что произошло исключение, когда функция вернула пустое значение.
При многократных вызовах DLL производительность может быть значительно улучшена с помощью ее явной загрузки (это не является необходимостью для стандартных DLL типа User32, т.к. они загружены всегда). Этот прием позволяет избежать внутреннего вызова LoadLibrary и FreeLibrary при каждом обращении к DllCall. Например:
Структура - совокупность членов (полей), совместно хранимых в памяти. Большинство членов, как правило, является целыми числами.
Функции, которые принимают указатель на структуру (или блок данных в памяти), можно вызвать, сохранив необработанные двоичные данные структуры в обычной переменной. Обычно предпринимаются следующие шаги:
Далее приведены функции, о которых упомянуто выше. Они могут быть вставлены в любой сценарий или включены через #Include. См. также примеры практического использования структур ниже.
Несмотря на встроенную обработку исключительных ситуаций, все же возможно аварийное завершение сценария из-за вызова DllCall. Это может случиться, если функция непосредственно не генерирует исключение, но приводит к какому-то несоответствию, типа плохого указателя или незавершенной строки. Это может и не являться ошибкой функции, если сценарий передал неподходящее значение типа плохого указателя или "str" с недостаточной вместимостью. Сценарий может также аварийно завершиться, если определен несоответствующий тип параметра или тип возвращаемого значения, например, если не выполнено требование, что обычное целое число, которое генерирует функция, должно являться типом со звездочкой или "str".
В версиях, начиная с 1.0.33.01, при определении типа параметра или типа возвращаемого значения, который не содержит пробела или звездочки, кавычки вокруг этого типа могут быть опущены. Например, str может использоваться вместо "str" и CDecl вместо "CDecl". В версиях, начиная с 1.0.34, символ P может использоваться вместо звездочки, чтобы позволить опустить кавычки. Например: UIntP.
Функция, которая возвращает адрес одной из строк, которую ей передавали, может возвратить идентичную строку в адресе памяти, отличном от ожидаемого. Например, вызов CharLower(CharUpper(MyVar)) на языке программирования конвертировал бы содержимое MyVar в нижний регистр. Но когда то же самое делается с помощью DllCall(), MyVar может оказаться в верхнем регистре после следующего вызова, потому что CharLower будет оперировать с временной строкой, содержание которой идентично MyVar:
Чтобы обойти это, измените два подчеркнутых выше "str" на UInt. Это приведет к тому, что значение, возвращаемое CharUpper, будет интерпретировано как чистый адрес, который будет передан CharLower как целое число.
Вызов функции API Windows "MessageBox" с сообщением, какую кнопку нажал пользователь.
Вызов функции API "IsWindowVisible", чтобы узнать, видимо ли окно Notepad.
Вызов API wsprintf(), чтобы дополнить число 432 лидирующими нулями до 10 символов.
QueryPerformanceCounter() может использоваться, если вы нуждаетесь в большей точности, чем может дать встроенная переменная A_TickCount.
Если передан HWND окна, а также текст или ClassNN одного из его элементов управления, следующая функция возвращает HWND этого элемента управления.
Следующий пример требует описанную выше функцию GetChildHWND(). Этот пример наблюдает за активным окном и отображает вертикальную позицию полосы прокрутки его активного в настоящий момент элемента управления.
Запись некоторого текста в файл и чтение его назад в память (требует v1.0.34 +). Этот метод может использоваться для увеличения производительности в тех случаях, когда много файлов читается или записывается одновременно.
Пример использования структуры: передаем адрес структуры RECT функции GetWindowRect(), которая присваивает членам структуры позиции left, top, right и bottom границ окна (относительно экрана).
Пример использования структуры: передаем функции FillRect() адрес структуры RECT, которая указывает область экрана, которая временно закрашивается красным.
Пример использования структуры: изменяем системную дату и время. Проявите осмотрительность: если дата изменяется на будущую, это может заставить преждевременно выполняться плановые работы!