Вот пример кода в бухпрограмме Инфо-Предприятие c использованием внешней DLL dynwrapx.dll
Код:
ЕСЛИ ЕСТЬ_ОБЪЕКТ("DynamicWrapperX.2") ТО
// ПОПЫТКА
DX = СОЗДАТЬ_ОБЪЕКТ!("DynamicWrapperX.2")//,"dynwrapx.dll")//,"",АВТО)//IDispatch)//,"wtsapi32.dll");//Создание объекта.
// DX.DllInstall
//DX.Register("dynwrapx.dll","DllRegisterServer")
// DX.Register("dynwrapx.dll","DllRegisterServer")
//DX.DllRegisterServer
DX.Register("user32.dll", "MessageBoxW", "i=hwWu", "r=l"); // Регистрация функции из dll. //i= перечисляются типы параметров
// ОТЛАДКА(DXX)
text="Вопрос"
предложение="Есть удаленное подключение к компьютеру!"
DX.Register("wtsapi32.dll","WTSQuerySessionInformationA", "i=hllll", "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","WTSConnectSessionW","r=l")//=pServerName")
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" );
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.
DX.WTSFreeMemory ( ppBuffer )
lRet = DX.WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE,WTS_CURRENT_SESSION,WTSClientAddress, ppBuffer, pBytesReturned)
ЕСЛИ lRet <> 0 ТО //ЛАДКА(pBytesReturned)
BytesReturned = DX.NumGet((pBytesReturned), 0, "u" );
// ОТЛАДКА (BytesReturned);
pBuffer = DX.NumGet((ppBuffer), 0, "u" );
Address_Family = DX.NumGet ( pBuffer, 0, "u" )
// ОТЛАДКА(lRet,Address_Family,pBuffer)//DX.StrGet(pBuffer, "s" )) ) // 0, -1, 5, 132827680, 132821488
// ОТЛАДКА(СТР(DX.NumGet ( pBuffer, 1)) ,DX.NumGet ( pBuffer, 2, "b" ),DX.NumGet ( pBuffer, 3, "b" ) , DX.NumGet ( pBuffer, 4, "b" ) ,DX.NumGet ( pBuffer, 5, "b" ), DX.NumGet ( pBuffer, 6, "b" ) , DX.NumGet ( pBuffer, 7, "b" ),DX.NumGet ( pBuffer, 8, "b" ) ,DX.NumGet ( pBuffer, 9, "b" ),DX.NumGet ( pBuffer, 10, "b" ),DX.NumGet ( pBuffer, 11, "b" ) , DX.NumGet ( pBuffer, 12, "b" ),DX.NumGet ( pBuffer, 13, "b" ) ,DX.NumGet ( pBuffer, 14, "b" ) ,DX.NumGet ( pBuffer, 15, "b" ),DX.NumGet ( pBuffer, 16, "b" ) );
ЕСЛИ Address_Family=2 ТО
IPAdr=(СТР(DX.NumGet ( pBuffer, 6, "b" )) + "." +СТР( DX.NumGet ( pBuffer, 7, "b" ))+"." +СТР(DX.NumGet ( pBuffer, 8, "b" ))+ "." +СТР( DX.NumGet ( pBuffer, 9, "b" )));
ЕСЛИ (DX.WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE,WTS_CURRENT_SESSION,WTSClientName, ppBuffer, pBytesReturned))<>0 ТО
ptr= DX.NumGet(ppBuffer,"u")
ПОПЫТКА
str= DX.StrGet( ptr,"z")
Computer=str
DX.WTSFreeMemory ( ptr )
DX.WTSFreeMemory ( str )
ИСКЛЮЧЕНИЕ
КОНЕЦ_ПОПЫТКИ
КОНЕЦ_ЕСЛИ
КОНЕЦ_ЕСЛИ