Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Вызов функций длл из 1С (число прочтений - 17525 )
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Вызов функций длл из 1С
10. Июля 2009 :: 06:45
Печать  
Мне нужно узнать из 1с IP адрес компа с к-го пользователь зашел в терминал.
Вариант c WMI почему-то не работает у меня. Сторонние exe файлы использовать не хочу (хотя если у кого есть - посоветуйте). В общем хочу напрямую обратиться к wtsapi32.dll у узнать всю необходимую инфу о указанной сессии, включая айпи адрес.
У меня есть код на visual basic но он не работает на vbs - не поддерживаются подключения к длл.
Читал здесь на формуе, что из 1с вызвать функции длл нельзя. Может есть какая внешняя компонента, через к-ю это можно сделать?
  
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #1 - 10. Июля 2009 :: 07:22
Печать  
  
Наверх
ICQ  
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #2 - 10. Июля 2009 :: 08:32
Печать  
Спасибо - буду смотреть. Есть примеры использования в 1с?

...

Тестовый пример работает. Жаль только что не получается его прикрутить к 1С как внешнюю компоненту ("остутствувет CLSID").
Буду пробовать дальше.

>Жаль только что не получается его прикрутить к 1С как внешнюю компоненту ("остутствувет CLSID").
А это, по-видимому, и не нужно. Все равно придется работать через MSScriptControl.ScriptControl

...
Примеры нашел
http://infostart.ru/blogs/905/
http://infostart.ru/blogs/915/
http://forum.script-coding.info/viewtopic.php?id=2216&p=1
« Последняя редакция: 10. Июля 2009 :: 12:23 - blindvic »  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #3 - 10. Июля 2009 :: 14:11
Печать  
Мучился 4 часа, но получилсоь.
Получилось получить айпи:
Код
Выбрать все
//*******************************************
Процедура Сформировать()

	DX = CreateObject("DynamicWrapperX");//Создание объекта.

	// Регистрация функции из dll
	DX.Register ("wtsapi32.dll", "WTSQuerySessionInformationA", "i=lllll", "r=l" ); // http://msdn.microsoft.com/en-us/library/aa383838(VS.85).aspx
	//BOOL WTSQuerySessionInformation(
	//  __in   HANDLE hServer,
	//  __in   DWORD SessionId,
	//  __in   WTS_INFO_CLASS WTSInfoClass,
	//  __out  LPTSTR *ppBuffer,
	//  __out  DWORD *pBytesReturned
	//);

	DX.Register ("wtsapi32.dll", "WTSFreeMemory", "i=u" ); // http://msdn.microsoft.com/en-us/library/aa383834(VS.85).aspx
	//void WTSFreeMemory(
	//  __in  PVOID pMemory
	//);

	// WTS_INFO_CLASS // Terminal Services Constants and Definitions
	WTSInitialProgram	 = 0; // http://msdn.microsoft.com/en-us/library/aa383861(VS.85).aspx
	WTSApplicationName	= 1;
	WTSWorkingDirectory     = 2;
	WTSOEMId		    = 3;
	WTSSessionId		= 4;
	WTSUserName		 = 5;
	WTSWinStationName	 = 6;
	WTSDomainName	     = 7;
	WTSConnectState	   = 8;
	WTSClientBuildNumber    = 9;
	WTSClientName	     = 10;
	WTSClientDirectory	= 11;
	WTSClientProductId	= 12;
	WTSClientHardwareId     = 13;
	WTSClientAddress	  = 14;
	WTSClientDisplay	  = 15;
	WTSClientProtocolType   = 16;
	WTSIdleTime		 = 17;
	WTSLogonTime		= 18;
	WTSIncomingBytes	  = 19;
	WTSOutgoingBytes	  = 20;
	WTSIncomingFrames	 = 21;
	WTSOutgoingFrames	 = 22;
	WTSClientInfo	     = 23;
	WTSSessionInfo	    = 24;



	WTS_CURRENT_SERVER_HANDLE = 0;
	WTS_CURRENT_SESSION = -1;

	ppBuffer = DX.StrPtr ( DX.Space ( 16 ) ); // Pointer (long) to a variable that receives a pointer to the requested information.

	pBytesReturned = DX.StrPtr ( DX.Space ( 4 ) ); // Pointer to a variable that receives the size, in bytes, of the data returned in ppBuffer.


	lRet = DX.WTSQuerySessionInformationA ( WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WtsClientAddress, ppBuffer, pBytesReturned) ;
    If lRet <> 0 Then
		BytesReturned = DX.NumGet ( pBytesReturned, 0, "u" );
		сообщить ( BytesReturned );
		pBuffer = DX.NumGet ( ppBuffer, 0, "u" );
		сообщить("" + DX.NumGet ( pBuffer, 6, "b" ) + "." + DX.NumGet ( pBuffer, 7, "b" )
			+ "." + DX.NumGet ( pBuffer, 8, "b" ) + "." + DX.NumGet ( pBuffer, 9, "b" ));

		DX.WTSFreeMemory ( ppBuffer );
	Else
		сообщить ("нет айпи адреса");
	EndIf


КонецПроцедуры
 


LPTSTR - указатель такого типа - сколько байт на него нужно? Я под него даю 16 байт ( если 8 - вылетает 1С ), но ведь это 128 бит...
« Последняя редакция: 13. Июля 2009 :: 07:12 - blindvic »  
Наверх
 
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #4 - 13. Июля 2009 :: 07:17
Печать  
В разных случаях по-разному. В твоем случае это указатель на структуру WTS_CLIENT_ADDRESS, хотя она не очень похожа на то, что нарисовано в MSDN.

Вот вариант вызова для имени пользователя:
Код
Выбрать все
	  ppBuffer = DX.StrPtr ( DX.Space ( 1,"" ) ); // Pointer (long) to a variable that receives a pointer to the requested information.

	pBytesReturned = DX.StrPtr ( DX.Space ( 1,"" ) ); // Pointer to a variable that receives the size, in bytes, of the data returned in ppBuffer.


	lRet = DX.WTSQuerySessionInformationA (WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION,WTSUserName, ppBuffer, pBytesReturned);
    If lRet <> 0 Then
		BytesReturned = DX.NumGet ( pBytesReturned, 0, "u" );
		Сообщить ( BytesReturned );
		pBuffer = DX.NumGet ( ppBuffer, 0, "u" );
		Name="";
		For i=0 To BytesReturned Do

			byte=DX.NumGet ( pBuffer, i, "b" );
			if byte=0 then
				break;
			else
				Name=Name+Chr(byte);
			endif;
		EndDo;
		Сообщить(Name);

		DX.WTSFreeMemory ( ppBuffer );
	Else
		Сообщить ("Не могу определить имя пользователя. ");
	EndIf 

 
Здесь это char * - указатель на строку C с нулевым байтом на конце. Судя по всему буфер выделяется уже внутри функции, поэтому без разницы, сколько байт ему скармливать перед вызовом. А вообще работа в 1С с этой библиотекой напоминает танцы с бубном. Ужас
  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #5 - 13. Июля 2009 :: 09:59
Печать  
Код
Выбрать все
		lRet = Запросить ( WTSUserName );
		Если lRet <> 0 Тогда
			ТекСеанс.ИмяПользователя = DX.StrGet ( pBuffer, "s" );
			DX.WTSFreeMemory ( ppBuffer );
		Иначе
			ТекСеанс.ИмяПользователя = ""; // не удалось получить имя пользователя
		КонецЕсли;
 

  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #6 - 13. Июля 2009 :: 10:07
Печать  
Alex_Bob писал(а) 13. Июля 2009 :: 07:17:
Судя по всему буфер выделяется уже внутри функции, поэтому без разницы, сколько байт ему скармливать перед вызовом.

Судя по всему -не все равно. Если выделяю буфер меньше 16 байт - 1С вылетает.
Цитата:
Pointer to a variable that receives a pointer to the requested information.

Т.е. я передаю указатель на буфер из 16 байт, в к-й функция положит адрес созданного ею буфера, в к-й она положила запрашиваемую информацию. Я долго в это врубался (давно уже не программировал на Си).
Не могу понять почему на указатель буфера нужно 16 байт. Хотя, это и не так уж важно. Просто интересно.
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #7 - 13. Июля 2009 :: 10:11
Печать  
Вот еще код для проверки состояния текущей сессии (чтобы, например, проверить, если сессия не отвалилась):
Код
Выбрать все
****
Функция Запросить ( WTSInfoClass )

	lRet = DX.WTSQuerySessionInformationA ( WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSInfoClass, ppBuffer, pBytesReturned );
	Если lRet = 1 Тогда
		pBuffer = DX.NumGet ( ppBuffer, 0, "u" );
		BytesReturned = DX.NumGet ( pBytesReturned, 0, "u" );
	КонецЕсли;
    Возврат lRet;

КонецФункции

****
Процедура ПроверитьСостояниеСессии () Экспорт // сессии терминального сервера
	lRet = Запросить ( 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 = WTSDisconnected Тогда
	КонецЕсли;
КонецПроцедуры

// typedef enum _WTS_CONNECTSTATE_CLASS { // http://msdn.microsoft.com/en-us/library/aa383860(VS.85).aspx
WTSActive = 0; WTSConnected = 1; WTSConnectQuery = 2; WTSShadow = 3; WTSDisconnected = 4;
WTSIdle = 5; WTSListen = 6; WTSReset = 7; WTSDown = 8; WTSInit = 9;
 


  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Вызов функций длл из 1С
Ответ #8 - 13. Июля 2009 :: 12:24
Печать  
А чем не устраивает командная стока. Чтобы узнать состояние сессии.

Код
Выбрать все
QUERY { PROCESS | SESSION | TERMSERVER | USER }

QUERY SESSION [<имя сеанса> | <пользователь> | <ID сеанса>]
		  [/SERVER:<сервер>] [/MODE] [/FLOW] [/CONNECT] [/COUNTER]

  <имя сеанса>	 Имя сеанса.
  <пользователь>     Сеанс пользователя с этим именем.
  <ID сеанса>	  Идентификатор сеанса.
  /SERVER:<сервер>   Опрашиваемый сервер (по умолчанию текущий).
  /MODE		  Отображение текущих параметров линии.
  /FLOW		  Отображение текущих параметров управления потоком.
  /CONNECT	     Отображение текущих параметров подключения.
  /COUNTER		Вывод информации счетчиков служб терминалов.
 

  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #9 - 13. Июля 2009 :: 13:01
Печать  
Да устраивает. Просто указанной программе нужно передать id, который надо вытаскиваить через ту же апи. Проще все делать в одном духе - напрямую. имхо
« Последняя редакция: 13. Июля 2009 :: 16:08 - blindvic »  
Наверх
 
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #10 - 14. Июля 2009 :: 05:03
Печать  
Код
Выбрать все
ppBuffer = DX.StrPtr ( DX.Space ( 16,"" ) ); 


Честно говоря, такой код в 1С вызывает подозрение. Согласно документации к библиотеке метод DX.Space() должен возвращать строку BSTR, под которую выделяется память. С такими строками работает VB и JS, а как эту строку переваривает интерпретатор 1С?
Кроме того, выделенная таким образом память не освобождается при уничтожении объекта. В твоих случаях это делает WTSFreeMemory, хотя для pBytesReturned ты его не вызываешь.

Я попытался провести эксперимент со строками на примере функции MessageBoxA. Если готовить строки для входных параметров по твоему способу, привыходе из 1С она падала.
Вот такой код вроде работает:
Код
Выбрать все
Процедура Сформировать()
	DX = CreateObject("DynamicWrapperX");

	// Регистрация функций dll
	DX.Register ("user32.dll", "MessageBoxA", "i=hlll", "r=l" );
	DX.Register ("kernel32.dll", "GlobalAlloc", "i=ul", "r=p" );
	DX.Register ("kernel32.dll", "GlobalFree", "i=p", "r=p" );


	Descr=    "Здравствуй, мир!";
	Caption = "Предупреждение";
	Handle = 0;
       	ppDescription = DX.GlobalAlloc ( 0, strlen(Descr)+1 );
	if ppDescription=0 then
		Message("Неудача при выделении памяти");
	endif;
	ppCaption = DX.GlobalAlloc ( 0, strlen(Caption)+1 );
	if ppCaption=0 then
		Message("Неудача при выделении памяти");
	endif;
	for i = 0 to strlen(Descr)-1 do
		DX.NumPut(Asc(mid(Descr,i+1,1)),ppDescription,i,"b");
	enddo;
	DX.NumPut(0,ppDescription, strlen(Descr) ,"b");

	for i = 0  to strlen(Caption)-1 do
		DX.NumPut(Asc(mid(Caption,i+1,1)),ppCaption,i,"b");
	enddo;
	DX.NumPut(0,ppCaption, strlen(Caption) ,"b");

	DX.MessageBoxA(Handle, ppDescription, ppCaption, 16);
	res=DX.GlobalFree(ppDescription);
	if res<>0 then
		Message("Неудача при освобождении памяти");
	endif;
	res=DX.GlobalFree(ppCaption);
	if res<>0 then
		Message("Неудача при освобождении памяти");
	endif;
	DX=0;
КонецПроцедуры
 



  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #11 - 14. Июля 2009 :: 06:09
Печать  
Спасибо за совет. Буду внедрять. Честно говоря, я сам чувствовал что-то неладное в этом коде:
Код
Выбрать все
ppBuffer = DX.StrPtr ( DX.Space ( 16,"" ) );  




Просто здесь (http://infostart.ru/blogs/905/?p=2) сделано так же:
Цитата:
в 1с будет немного кузяво
Rect = Wrap.Space(256); // необходимо 4 DWord
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #12 - 14. Июля 2009 :: 12:04
Печать  
Было бы оечнь прикольно иметь в 1С++ функциональность DynamicWrapperX. Все пара методов - зато сколько всего можно сделать имея доступ в библиотекам винды.
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #13 - 14. Июля 2009 :: 12:47
Печать  
Сколько же нужно байт для хранения указателя? Переправил на:
Код
Выбрать все
ppBuffer = DX.GlobalAlloc ( 0, 16 );
pBytesReturned = DX.GlobalAlloc ( 0, 4 ); 


1С вылетает.

Alex_Bob писал(а) 14. Июля 2009 :: 05:03:
Согласно документации к библиотеке метод DX.Space() должен возвращать строку BSTR, под которую выделяется память. С такими строками работает VB и JS, а как эту строку переваривает интерпретатор 1С?

Видимо
Код
Выбрать все
ppBuffer = DX.StrPtr ( DX.Space ( 16 ) ) 


резервирует достаточно памяти.

Но даже если делаю
Код
Выбрать все
ppBuffer = DX.GlobalAlloc ( 0, 128 ); 

1С временами вылетает...
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #14 - 02. Октября 2009 :: 06:51
Печать  
Цитата:
Функция Запросить ( 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 регулярно вылетает. Никто не знает в чем проблема?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать