суббота, 23 августа 2014 г.

Озвучивание системного времени по горячей клавише (вызов любой функции DLL из VBS)

...в связи с поступающими вопросами хочу разъяснить некоторые моменты. Сам VBScript умеет работать только с COM-объектами, представленная же библиотека 'ra_snd.dll' такой объект не создает и не регистрирует. Так как же быть? Как просто вызвать некоторую функцию из DLL, не переделывая саму DLL (это хорошо, если есть исходники )?

Решение есть, это использование внешнего COM-сервера (библиотеки) 'dynwrap.dll'. Библиотека 'dynwrap.dll' распространяется свободно. COM-сервер (ActiveX) позволяет вызвать любую экспортируемую функцию любой DLL. Cвоего рода, обертка. Как и любой COM - объект, 'dynwrap.dll' тоже требует регистрации в системе. В дальнейшем будем работать с NT-версией. Напишем небольшой батничек для автоматизации (назовем его 'regdynwrap.bat'):
regsvr32.exe dynwrap.dll
И запустим:


Зарегистрировался в системе? Отлично, теперь мы можем вызывать любые функи из обычных DLL. Напишем сам скрипт VBS вызова плагина:
Set Wrap = CreateObject("DynamicWrapper")
Wrap.Register "ra_snd.dll", "key", "i=ll", "f=s", "r=l"
res = Wrap.key(0, 0)
Поясним содержимое скрипта:
  1. Cтрока создает единственный объект "DynamicWrapper", с которым и будем работать
  2. Cтрока регистрирует вызов нужной нам библиотеки "ra_snd.dll", имя функции "key()", i - указывает количество и тип вызываемых параметров, f - тип вызова (_stdcall, _cdecl), r - тип возвращаемых данных (если есть).
Возможные значения параметра f:
  • '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
Возможные типы данных:
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
 }
Cтрока вызывает функцию с передачей параметров. Все. Теперь сохраним его в файл 'runsound.vbs' и можем запускать. Также можно назначить ярлык на скрипт, вынести его на рабочий стол и назначить "горячие клавиши" на него.


Полный проект со скриптами, плагином озвучивания системного времени 'run_snd.dll'.

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.