Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Библиотека dynwrap.dll и вызов функций Win 32 API

Назначение и установка

Библиотека dynwrap.dll - небольшой ActiveX, который может быть использован в любых средах, которые в состоянии выступить в роли OLE-клиента, например, в MS Office (VBA), 1C:Предприятии, административных скриптах Windows (.vbs и .js) и т.д. Библиотека является результатом труда нескольких разработчиков. Библиотека dynwrap.dll распространяется свободно. Вы можете скачать библиотеку здесь (версия для Windows 9x от 09.02.1999г., архив 13 369 байт) и здесь (версия для Windows NT от 13.01.1999г., архив 13 314 байт). Ссылка на первоисточник здесь. Примеры кода в настоящей статье приводятся на языке VBScript для административных сценариев Windows.

Библиотека обеспечивает подобие инструкции "Declare" в VBScript. Это позволяет вызывать произвольные функции из DLL-библиотек (например, win32 функции API).

Порядок установки:

ProgID единственного объекта, предоставляемого библиотекой - "DynamicWrapper".

Использование

Объект библиотеки создаётся следующим образом:


Set UserWrap = CreateObject("DynamicWrapper")

Объявление функции производится примерно следующим образом:


UserWrap.Register "USER32.DLL", "FindWindowExA", "i=llsl", "f=s", "r=l"

Параметры при объявлении содержат имя библиотеки, имя функции, а также:

Возможные типы данных:


const ARGTYPEINFO ArgInfo[] =
{
{'a', sizeof(IDispatch*), VT_DISPATCH}, // a IDispatch*
{'c', sizeof(unsigned char), VT_I4}, // c signed char
{'d', sizeof(double), VT_R8}, // d 8 byte real
{'f', sizeof(float), VT_R4}, // f 4 byte real
{'k', sizeof(IUnknown*), VT_UNKNOWN}, // k IUnknown*
{'h', sizeof(long), VT_I4}, // h HANDLE
{'l', sizeof(long), VT_I4}, // l long
{'p', sizeof(void*), VT_PTR}, // p pointer
{'s', sizeof(BSTR), VT_LPSTR}, // s string
{'t', sizeof(short), VT_I2}, // t short
{'u', sizeof(UINT), VT_UINT}, // u unsigned int
{'w', sizeof(BSTR), VT_LPWSTR}, // w wide string
}

Примечание: для строк в некоторых случаях работает тип 'r' VT_BYREF (передача по ссылке).

Вызов функции производится примерно следующим образом:


ResHandle = UserWrap.FindWindowExA(Hwnd, 0, "ListBox", 0)

Для Windows 9x есть некоторые особенности. Если вы намереваетесь вызвать несколько различных функций API, вы должны объявить для каждой функции свою собственную объектную переменную. Кроме того, некоторые параметры, передающиеся API, должны быть преобразованы из Variant к требуемому типу данных с использованием CString или аналогичных функций.

Примеры кода

Тщательно тестируйте любой код, связанный с вызовом API, для всех возможных ситуаций и условий исполнения.

Подача звукового сигнала с помощью системного динамика

Функция Beep (библиотека kernel32) генерирует звуковой сигнал:


Beep (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long

Параметры:

В Windows 95 функция просто выдаёт звуковой сигнал по умолчанию, а переданные параметры игнорируются.

Пример кода:


Set Wrap = CreateObject("DynamicWrapper")
Wrap.Register "KERNEL32.DLL", "Beep", "i=ll", "f=s", "r=l"
res = Wrap.Beep(500, 100)
res = Wrap.Beep(550, 100)
res = Wrap.Beep(600, 100)
res = Wrap.Beep(650, 100)
res = Wrap.Beep(700, 700)
WScript.Sleep 200
res = Wrap.Beep(700, 100)
res = Wrap.Beep(650, 100)
res = Wrap.Beep(600, 100)
res = Wrap.Beep(550, 100)
res = Wrap.Beep(500, 700)

Получение заголовка активного окна

ФункцияБиблиотекаОписание
GetForegroundWindow() As Long user32 Функция возвращает хэндл активного окна активного приложения.
SendMessage(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long user32 Функция отправляет указанное сообщение указанному окну. Возвращаемое значение зависит от сообщения. Параметры:
  • hwnd - хэндл окна, получающего сообщение.
  • wMsg - идентификатор сообщения.
  • wParam - зависит от сообщения.
  • lParam - зависит от сообщения.

Сообщение WM_GETTEXT отправляется окну для получения текста окна. Параметр wParam должен содержать размер получаемой строки, параметр lParam - ссылку на переменную, которая будет заполнена текстом окна.

Пример кода:


Const WM_GETTEXT = &HD
Set Wrap = CreateObject("DynamicWrapper")
Wrap.Register "USER32.DLL", "GetForegroundWindow", "f=s", "r=l"
Wrap.Register "USER32.DLL", "SendMessage", "i=lllr", "f=s", "r=l"
Title = Space(100)
res = Wrap.SendMessage(Wrap.GetForegroundWindow(), WM_GETTEXT , 100, Title)
MsgBox Title

Определение состояния NumLock

Функция GetKeyState (библиотека user32) получает состояние заданной виртуальной клавиши на момент получения от неё последнего сообщения о вводе.


GetKeyState (ByVal nVirtKey As Long) As Integer

Возвращаемое значение: бит 0 равен 1 для клавиш-переключателей (CapsLock, NumLock и ScrollLock), если клавиша находится во включённом состоянии. Бит 15 равен 1, если клавиша нажата, и 0, если клавиша отпущена.

Приведённый ниже скрипт включает NumLock, если он выключен. Если пользователь удерживает клавишу в момент запуска скрипта, скрипт не производит никаких действий.


Const VK_NUMLOCK = &H90
Set Wrap = CreateObject("DynamicWrapper")
Wrap.Register "USER32.DLL", "GetKeyState", "i=l", "f=s", "r=l"
res = Wrap.GetKeyState(VK_NUMLOCK)
If res = 0 Then
	Set WshShell = CreateObject("WScript.Shell")
	WshShell.SendKeys "{NUMLOCK}"
End If

Смена раскладки клавиатуры для текущей нити (процесса)

ФункцияБиблиотекаОписание
ActivateKeyboardLayout(ByVal HKL As Long, ByVal flags As Long) As Long user32 Функция активизирует заданную раскладку клавиатуры. Параметры:
  • HKL - манипулятор нужной раскладки клавиатуры.
  • flags - опции, комбинация констант (подробнее - см. MSDN).
LoadKeyboardLayout(ByVal pwszKLID As String, ByVal flags As Long) As Long user32 Функция загружает указанную раскладку клавиатуры и возвращает манипулятор раскладки или 0 в случае неудачи. Параметры:
  • pwszKLID - строка из 8 символов, описывающая имя раскладки клавиатуры.
  • flags - опции, комбинация констант (подробнее - см. MSDN).

Пример кода на встроеннном языке 1С:Предприятия v7.7 (этот код устанавливает русскую раскладку клавиатуры):


Wrapper = CreateObject("DynamicWrapper");
Wrapper.Register("USER32.DLL", "ActivateKeyboardLayout", "i=ll", "f=s", "r=l");
Wrapper.Register("USER32.DLL", "LoadKeyboardLayout", "i=sl", "f=s", "r=l");
rus = Wrapper.LoadKeyboardLayout("00000419", 0);
//eng = Wrapper.LoadKeyboardLayout("00000409", 0);
Wrapper.ActivateKeyboardLayout(rus, 0);

Составление - Людоговский Александр

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.