Перейти на главную страничку сайта (список статей, файлы для скачивания)
Библиотека 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 | Функция отправляет указанное сообщение указанному окну. Возвращаемое значение зависит от сообщения. Параметры:
|
Сообщение 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
Функция 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 | Функция активизирует заданную раскладку клавиатуры. Параметры:
|
LoadKeyboardLayout(ByVal pwszKLID As String, ByVal flags As Long) As Long | user32 | Функция загружает указанную раскладку клавиатуры и возвращает манипулятор раскладки или 0 в случае неудачи.
Параметры:
|
Пример кода на встроеннном языке 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 При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.