Функция Запросить ( WTSInfoClass )
lRet = DX.WTSQuerySessionInformationA ( 0, -1, WTSInfoClass, ppBuffer, pBytesReturned );
Если lRet = 1 Тогда
pBuffer = DX.NumGet ( ppBuffer, 0, "u" );
BytesReturned = DX.NumGet ( pBytesReturned, 0, "u" );
КонецЕсли;
Возврат lRet;
КонецФункции
****
Функция ПолучитьСостояниеСессии () // текущей сессии терминального сервера
lRet = Запросить ( 8 ); // WTSConnectState
Если lRet <> 0 Тогда
Session_Connection_State = DX.NumGet ( pBuffer, 0, "l" ); // Pointer to an INT variable that contains a value from the WTS_CONNECTSTATE_CLASS enumeration type to indicate the session's current connection state.
DX.WTSFreeMemory ( ppBuffer );
Иначе
Session_Connection_State = -1;
КонецЕсли;
Возврат Session_Connection_State;
КонецФункции
****
Функция ПолучитьИмяКомпьютераКлиента ()
lRet = Запросить ( 10 ); // WTSClientName
Если lRet <> 0 Тогда
Компьютер = DX.StrGet ( pBuffer, "s" );
DX.WTSFreeMemory ( ppBuffer );
Иначе
Компьютер = ""; // не удалось получить имя компьютера
КонецЕсли;
Возврат Компьютер;
КонецФункции
****
Функция ПолучитьАйДиЖелезаКлиента ()
lRet = Запросить ( 13 ); // WTSClientHardwareId
Если lRet <> 0 Тогда
_HardwareId = DX.NumGet ( pBuffer, 0, "u" ); // какой-то глюк - всегда 0 показывает
DX.WTSFreeMemory ( ppBuffer );
Иначе
_HardwareId = 0;
КонецЕсли;
Возврат _HardwareId;
КонецФункции
****
Функция ПолучитьАйПи ()
lRet = Запросить ( 14 ); // WTSClientAddress
Если lRet <> 0 Тогда
Address_Family = DX.NumGet ( pBuffer, 0, "u" );
Если Address_Family = 2 Тогда
АйПи = "" + DX.NumGet ( pBuffer, 6, "b" ) + "." + DX.NumGet ( pBuffer, 7, "b" )
+ "." + DX.NumGet ( pBuffer, 8, "b" ) + "." + DX.NumGet ( pBuffer, 9, "b" );
ИначеЕсли Address_Family = 0 Тогда
Иначе
АйПи = ""; // неподдерживаемый адрес сети (" + Address_Family + ")"
КонецЕсли;
DX.WTSFreeMemory ( ppBuffer );
Иначе
АйПи = "";
КонецЕсли;
Возврат АйПи;
КонецФункции
****
Процедура Конструктор ()
Попытка
DX = СоздатьОбъект ( "DynamicWrapperX" ); // regsvr32 -i /s dynwrapx.dll //
http://www.script-coding.info/dynwrapx.html // Регистрация функции из dll
DX.Register ( "wtsapi32.dll", "WTSQuerySessionInformationA", "i=lllll", "r=l" ); //
http://msdn.microsoft.com/en-us/library/aa383838(VS.85).aspx DX.Register ( "wtsapi32.dll", "WTSFreeMemory", "i=u" ); //
http://msdn.microsoft.com/en-us/library/aa383834(VS.85).aspx DX.Register ("kernel32.dll", "GlobalAlloc", "i=ul", "r=p" );
DX.Register ("kernel32.dll", "GlobalFree", "i=p", "r=p" );
ppBuffer = DX.GlobalAlloc ( 0, 1024 );
//ppBuffer = DX.StrPtr ( DX.Space ( 16) ); // Pointer to a variable that receives a pointer to the requested information. The format and contents of the data depend on the information class specified in the WTSInfoClass parameter. To free the returned buffer, call the WTSFreeMemory function.
pBytesReturned = DX.GlobalAlloc ( 0, 1024 );
//pBytesReturned = DX.StrPtr ( DX.Space ( 4) ); // Pointer to a variable that receives the size, in bytes, of the data returned in ppBuffer.
lRet = Запросить ( 5 ); // WTSUserName
Если lRet <> 0 Тогда
ТекСеанс.ИмяПользователя = DX.StrGet ( pBuffer, "s" );
DX.WTSFreeMemory ( ppBuffer );
Иначе
ТекСеанс.ИмяПользователя = ""; // не удалось получить имя пользователя
КонецЕсли;
ТекСеанс.АйПи = ПолучитьАйПи ();
ТекСеанс.Компьютер = ПолучитьИмяКомпьютераКлиента ();
HardwareId = ПолучитьАйДиЖелезаКлиента ();
Исключение
Сообщить ( "Не удалось создать объект DynamicWrapperX. Сообщите администратору." );
КонецПопытки;
КонецПроцедуры
****
Процедура ПроверитьСостояниеСессии () Экспорт // сессии терминального сервера
Session_Connection_State = ПолучитьСостояниеСессии ();
Если Session_Connection_State = 0 Тогда // WTSActive // форма блокировки открыта и сессия вновь активна
АйПи = ПолучитьАйПи ();
Компьютер = ПолучитьИмяКомпьютераКлиента ();
Если ( АйПи = СокрЛП ( ТекСеанс.АйПи ) ) И ( Компьютер = СокрЛП( ТекСеанс.Компьютер ) ) Тогда // по-видимому, подлючение с того же компа
КонтекстБлокировкаСеанса1С.флМожноЗакрытьФорму = 1;
КонтекстБлокировкаСеанса1С.Форма.Закрыть ();
ТекСеанс.АйПи = ПолучитьАйПи ();
ТекСеанс.Компьютер = ПолучитьИмяКомпьютераКлиента ();
ТекСеанс.Записать ();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
****
Процедура Деструктор ()
DX.GlobalFree ( ppBuffer );
DX.GlobalFree ( pBytesReturned );
DX = 0;
КонецПроцедуры
1C регулярно вылетает. Никто не знает в чем проблема?