Форум » [x]Harbour » Как определить - терминалка или консоль » Ответить

Как определить - терминалка или консоль

suv: Похоже, глюки в Винсервер 2003 Сначала на самом верваке переменная окружения SESSIONNAME=Console После подключения по RDP в терминальной сессии SESSIONNAME=RPD-Tcp#58, CLIENTNAME=клиент После этого в новых сессиях ДОС на самом серваке переменные окружения становятся такими же, как в терминальной сессии. То есть SESSIONNAME=Console меняется на SESSIONNAME=RPD-Tcp#58 Печально. 1) может быть это как-то лечится? 2) как определить - работает прога на самой консоли или в терминальном режиме?

Ответов - 11

Sergy: Дабы не плодить новые, подниму старую тему. Нужно различить прогу, работающую в консольном режиме от программы, работающей на сервере через терминал. раньше проблем не было, определял так: [pre2] FUNC IsTerminal() STATIC term_result := NIL LOCAL sx,i,cnt,cx IF (term_result == NIL) // пока не определен ? sx := UPPER(ENVPARAM()) cnt := NUMTOKEN(sx,CRLF) term_result := FALSE // заранее - пессимистично FOR i:=1 TO cnt cx:=TOKEN(sx,CRLF,i) IF ("SESSIONNAME" $ cx) IF ("RDP" $ cx) .AND. ("#" $ cx) term_result:=TRUE ENDI EXIT ENDI NEXT i ENDI RETURN term_result [/pre2] Сейчас появилось несколько машин, которые работают с сервером по сети, но доступ к ним осуществляется через RDP, соотв. этот метод не работает - мой IsTermial() возвращает TRUE.

petr707: Программу из разных конфигураций можно запускать разными батниками с разными ключами или разными set-установками ====bat1.cmd=== set conf=1 exam.exe ====bat2.cmd=== set conf=2 exam.exe или ====bat1.cmd=== exam.exe conf1 ====bat2.cmd=== exam.exe conf2

Sergy: petr707 пишет: Программу из разных конфигураций можно запускать разными батниками с разными ключами или разными set-установками Это логично и скорее всего будет использовано на крайний случай. Но ведь конечно хочется определения "на автомате". Как вариант - было-бы достаточно определить локальный или "сетевой" любой файл из базы данных. Или буква диска пути к ней... В Harbour нет ничего подобного?


petr707: все равно лучше управлять ситуацией, чем зависеть от того что вернет set>set.txt можно самому создать и потом проверить достуность ресурса, который доступен только в консоли, например C:\console\blabla.bla И клиент терминальный может быть в принципе не Windows, SESSIONNAME будет присутствовать, а остальное - не гарантируется

Sergy: Согласен, что лучше управлять ситуацией, но наличие к-л ресурса нужно искусственно выдумывать, не забывать прописывать и тп. А это - лишние телодвижения, о которых можно через какое-то время и забыть. Вот это: http://msdn.microsoft.com/en-us/library/windows/desktop/aa364939(v=vs.85).aspx реально прикрутить к Harbor ?

petr707: Речь идет об этой теме ? http://clipper.borda.ru/?1-4-0-00000666-000-10001-0-1370002542 поиск на сайте работает

Sergy: Видимо, "мой кунфу недостаточно хорош", при компиляции скопированного примера выдается куча сишных ошибок, с которыми я не знаю, чего делать: drive_type.prg: In function 'HB_FUN_GETVOLUMEINFORMATION': drive_type.prg:69:1: warning: implicit declaration of function 'ISNIL' [-Wimplicit-function-declaration] drive_type.prg:79:1: warning: implicit declaration of function 'ISBYREF' [-Wimplicit-function-declaration] C:/Temp/hbmk_zqnq1u.dir/drive_type.o:drive_type.c:(.text+0x2a): undefined reference to `ISNIL' C:/Temp/hbmk_zqnq1u.dir/drive_type.o:drive_type.c:(.text+0xa8): undefined reference to `ISBYREF' C:/Temp/hbmk_zqnq1u.dir/drive_type.o:drive_type.c:(.text+0xbc): undefined reference to `ISBYREF' C:/Temp/hbmk_zqnq1u.dir/drive_type.o:drive_type.c:(.text+0xd0): undefined reference to `ISBYREF' C:/Temp/hbmk_zqnq1u.dir/drive_type.o:drive_type.c:(.text+0xe0): undefined reference to `ISBYREF' C:/Temp/hbmk_zqnq1u.dir/drive_type.o:drive_type.c:(.text+0xf0): undefined reference to `ISBYREF' collect2: ld returned 1 exit status hbmk2: Error: Running linker. 1 Нашел поиском по форуму "недокументированную" в Harbour функцию DriveType() - но линкер выдает сообщение об ошибке, что HB_FUNC_DRIVETYPE не найдена...

petr707: Попробуйте это #define CRLF chr(13)+chr(10) Proc main() ? cdisks() inkey(0) return nil Function get_diskInf(cPath , cVolName, nSerNum, cDiskSerial) Local ret:=.f. Local nMaxName Local nFlags Local cFATName cVolName :="" cDiskSerial :="" If GetVolumeInformation( cPath , @cVolName, @nSerNum , @nMaxName , @nFlags , @cFATName ) cDiskSerial := I2Hex( nSerNum / 65536 ) + "-" + I2Hex( nSerNum ) ret:=.t. EndIf return ret Function cdisks() Local ss:="",aDrives:={} aDrives:= getdrives() ss:="" aeval(adrives,{|x| ss:=ss+" "+x[2]+" "+PADR(x[3],20)+" "+PADR(x[4],9)+" "+x[5]+" "+x[7]+CRLF}) return ss Function GetDrives() local n, cDrv, nDrv, cVolume := "", aDrive := {} Local nSerNum ,cDiskSerial :="" ,cTyp:="",ret:=.f.,cHex:="",nSize:=0,cSize:="" #define DRIVE_UNKNOWN 0 #define DRIVE_NO_ROOT_DIR 1 #define DRIVE_REMOVABLE 2 #define DRIVE_FIXED 3 #define DRIVE_REMOTE 4 #define DRIVE_CDROM 5 #define DRIVE_RAMDISK 6 for n := 1 To 26 cDrv := Chr( 64 + n ) nDrv := GetDriveType( cDrv + ":\" + Chr(0) ) cTyp:=space(9) nSize:=0 cSize:="" if nDrv > 1 DO case case ndrv=2 cTyp :="REMOVABLE" case ndrv=3 cTyp :="FIXED " case ndrv=4 cTyp :="REMOTE " case ndrv=5 cTyp :="CDROM " case ndrv=6 cTyp :="RANDISK " otherwise cTyp :="UNKNOWN " endcase cDiskSerial :="" nSize:=0 cSize:="" if nDrv == 2 .and. Upper(cDrv) == "A" cVolume := [3 1/2"] cDiskSerial :="" ret:=.t. else cVolume := "" cDiskSerial :="" nSerNum :=NIL ret :=GetVolumeInformation( cDrv + ":\", @cVolume , @nSerNum) if ret cDiskSerial := I2Hex( nSerNum / 65536 ) + "-" + I2Hex( nSerNum ) BEGIN SEQUENCE nSize := HB_DISKSPACE(cDrv+ ":\", 3)//HB_DISK_TOTAL) if nSize#0 cSize := str(nSize/1048576,16,2)+" Mb" endif RECOVER nSize:=0 END SEQUENCE endif endif Aadd( aDrive, { if(n = 1, 1, nDrv), cDrv, IF(Empty(cVolume), "none", cVolume) ,cDiskSerial ,cTyp ,nSize,cSize} ) endif next Return aDrive #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #include "hbapiitm.h" #ifndef __XHARBOUR__ #define ISBYREF( n ) HB_ISBYREF( n ) #define ISNIL( n ) HB_ISNIL( n ) #endif static char * u2Hex( WORD wWord ) { static far char szHex[ 5 ]; WORD i= 3; do { szHex[ i ] = 48 + ( wWord & 0x000F ); if( szHex[ i ] > 57 ) szHex[ i ] += 7; wWord >>= 4; } while( i-- > 0 ); szHex[ 4 ] = 0; return szHex; } HB_FUNC( I2HEX ) { hb_retc( u2Hex( hb_parni( 1 ) ) ); } /* Returns one of these: #define DRIVE_UNKNOWN 0 #define DRIVE_NO_ROOT_DIR 1 #define DRIVE_REMOVABLE 2 #define DRIVE_FIXED 3 #define DRIVE_REMOTE 4 #define DRIVE_CDROM 5 #define DRIVE_RAMDISK 6 */ HB_FUNC( GETDRIVETYPE ) { hb_retni( GetDriveType( (LPCSTR) hb_parc( 1 ) ) ) ; } HB_FUNC( GETVOLUMEINFORMATION ) { char *VolumeNameBuffer = (char *) hb_xgrab( MAX_PATH ) ; DWORD VolumeSerialNumber ; DWORD MaximumComponentLength ; DWORD FileSystemFlags ; char *FileSystemNameBuffer = (char *) hb_xgrab( MAX_PATH ) ; BOOL bRet; bRet = GetVolumeInformation( ISNIL(1) ? NULL : (LPCTSTR) hb_parc(1) , (LPTSTR) VolumeNameBuffer , MAX_PATH , &VolumeSerialNumber , &MaximumComponentLength , &FileSystemFlags , (LPTSTR)FileSystemNameBuffer , MAX_PATH ) ; if ( bRet ) { if ( ISBYREF( 2 ) ) hb_storc ((char *) VolumeNameBuffer, 2 ) ; if ( ISBYREF( 3 ) ) hb_stornl( (LONG) VolumeSerialNumber, 3 ) ; if ( ISBYREF( 4 ) ) hb_stornl( (LONG) MaximumComponentLength, 4 ) ; if ( ISBYREF( 5 ) ) hb_stornl( (LONG) FileSystemFlags, 5 ); if ( ISBYREF( 6 ) ) hb_storc ((char *) FileSystemNameBuffer, 6 ); } hb_retl(bRet); hb_xfree( VolumeNameBuffer ); hb_xfree( FileSystemNameBuffer ); } #pragma ENDDUMP

Sergy: petr707 пишет: Попробуйте это Спасибо, скомпилилось, буду разбираться.

Dima: Перенес тему

Andrey_IV: Печально. 1) может быть это как-то лечится? 2) как определить - работает прога на самой консоли или в терминальном режиме? Может это поможет: В "Harbour" есть функция: win_OsIsTSClient() // Библиотека "hbwin.lib" Возвращает .T. или .F. Или по другому: wapi_GetSystemMetrics(WIN_SM_REMOTESESSION) Эта возвращает == 0 для консоли и != 0 для терминала Например: /* Собирать с "hbwin.lib" */ #include "hbwin.ch" FUNCTION Main() ? "Session : " + IF(win_OsIsTSClient(), "Terminal", "Console") ? "Session : " + IF(wapi_GetSystemMetrics(WIN_SM_REMOTESESSION) != 0, "Terminal", "Console") RETURN NIL Проверил при подключении ч/з RDP на XP Pro SP3, Win Server 2003 R2, Win Server 2008 R2 - все отлично работает. Т.е. один и тот-же экзешник запускал одновременно в терминальной сессии ч/з RDP и его же на подключенном сетевом диске на сервере. Коды возврата верные. В обеих функциях используется WIN API ф-ция: [url=http://msdn.microsoft.com/en-us/library/windows/desktop/ms724385(v=vs.85).aspx]GetSystemMetrics[/url] Правда, там есть оговорка насчет Win Server 2003 и XP: "Windows Сервер 2003 и Windows XP: консольный сеанс не является обязательно физической консолью. Более подробно, смотри WTSGetActiveConsoleSessionId." Но с этим нужно более подробно разбираться.



полная версия страницы