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

1 декабря 2016 - Администратор

 

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

Библиотека 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).

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

  • Скопируйте библиотеку на жёсткий диск вашего компьютера, например в такой каталог:

    C:WINDOWSsystem32
     
  • Зарегистрируйте библиотеку с помощью regsvr32.exe. Командная строка регистрации библиотеки может выглядеть, например, так:

    regsvr32.exe "C:WINDOWSsystem32dynwrap.dll"
     

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

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

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


Set UserWrap = CreateObject("DynamicWrapper")

 

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


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

 

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

  • i - описывает количество и тип данных параметров функции. Если функция не принимает параметры, этот параметр можно опустить. Параметр i является строкой, количество букв в которой равно количеству параметров объявляемой функции. Первая буква задаёт тип первого параметра, вторая - втрого и т.д.
  • f - тип вызова: _stdcall, _cdecl и т.д. Значение по умолчанию - _stdcall. Возможные значения параметра:
    • 'm' - DC_MICROSOFT 0x0000, Default
    • 'b' - DC_BORLAND 0x0001, Borland compat
    • 's' - DC_CALL_STD 0x0020, __stdcall
    • 'c' - DC_CALL_CDECL 0x0010, __cdecl
    • '4' - DC_RETVAL_MATH4 0x0100, Return value in ST
    • '8' - DC_RETVAL_MATH8 0x0200, Return value in ST
  • r - тип возвращаемых данных.

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


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

 

Параметры:

  • dwFreq - частота звука от 37 до 32767 Гц.
  • dwDuration - продолжительность сигнала в миллисекундах.

В 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);

 

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

Источник

Страничка автора

Соседние статьи:

Это - цифровые программаторы микроконтроллеров, ПЗУ и ПЛИС - для школьников.

Рейтинг: 0 Голосов: 0 71 просмотр
Комментарии (0)

Нет комментариев. Ваш будет первым!

Система Orphus


Flag Counter

Последние фотографии