static int hb_gt_gui_Alert( PHB_GT pGT, PHB_ITEM pMessage, PHB_ITEM pOptions, int iClrNorm, int iClrHigh, double dDelay ) { void * hText; LPCTSTR lpText = HB_ITEMGETSTR( pMessage, &hText, NULL ); int iRet, iOptions = pOptions ? ( int ) hb_arrayLen( pOptions ) : 0; if( lpText && iOptions > 0 ) { int i, iType = 0; UINT uType; for( i = 1; i <= iOptions; ++i ) iType |= hb_gt_gui_optionId( hb_arrayGetCPtr( pOptions, i ) ); switch( iType ) { case 0x01: uType = MB_OK; break; case 0x03: uType = MB_OKCANCEL; break; case 0x06: uType = MB_RETRYCANCEL; break; case 0x0E: #ifdef MB_CANCELTRYCONTINUE uType = hb_iswin2k() ? MB_CANCELTRYCONTINUE : MB_ABORTRETRYIGNORE; #else uType = MB_ABORTRETRYIGNORE; #endif break; case 0x12: uType = MB_OKCANCEL; break; case 0x21: uType = MB_YESNO; break; case 0x30: uType = MB_YESNO; break; case 0x32: uType = MB_YESNOCANCEL; break; default: uType = MB_OK; break; } iRet = MessageBox( NULL, lpText, TEXT( "" ), uType ); iRet = hb_gt_gui_optionPos( iRet, iType, pOptions ); } else iRet = HB_GTSUPER_ALERT( pGT, pMessage, pOptions, iClrNorm, iClrHigh, dDelay ); hb_strfree( hText ); return iRet; }
static HB_BOOL hb_SetDefaultPrinter( LPCTSTR lpPrinterName ) { #if ! defined( HB_OS_WIN_CE ) BOOL bFlag; DWORD dwNeeded = 0; HANDLE hPrinter = NULL; PRINTER_INFO_2 * ppi2 = NULL; LPTSTR pBuffer = NULL; /* If Windows 95 or 98, use SetPrinter. */ if( hb_iswin9x() ) { /* Open this printer so you can get information about it. */ bFlag = OpenPrinter( ( LPTSTR ) lpPrinterName, &hPrinter, NULL ); if( ! bFlag || ! hPrinter ) return HB_FALSE; /* The first GetPrinter() tells you how big our buffer must be to hold ALL of PRINTER_INFO_2. Note that this will typically return FALSE. This only means that the buffer (the 3rd parameter) was not filled in. You do not want it filled in here. */ SetLastError( 0 ); bFlag = GetPrinter( hPrinter, 2, 0, 0, &dwNeeded ); if( ! bFlag ) { if( ( GetLastError() != ERROR_INSUFFICIENT_BUFFER ) || ( dwNeeded == 0 ) ) { ClosePrinter( hPrinter ); return HB_FALSE; } } /* Allocate enough space for PRINTER_INFO_2. */ ppi2 = ( PRINTER_INFO_2 * ) hb_xgrab( dwNeeded ); /* The second GetPrinter() will fill in all the current information so that all you have to do is modify what you are interested in. */ bFlag = GetPrinter( hPrinter, 2, ( LPBYTE ) ppi2, dwNeeded, &dwNeeded ); if( ! bFlag ) { ClosePrinter( hPrinter ); hb_xfree( ppi2 ); return HB_FALSE; } /* Set default printer attribute for this printer. */ ppi2->Attributes |= PRINTER_ATTRIBUTE_DEFAULT; bFlag = SetPrinter( hPrinter, 2, ( LPBYTE ) ppi2, 0 ); if( ! bFlag ) { ClosePrinter( hPrinter ); hb_xfree( ppi2 ); return HB_FALSE; } /* Tell all open programs that this change occurred. Allow each program 1 second to handle this message. */ SendMessageTimeout( HWND_BROADCAST, WM_SETTINGCHANGE, 0L, ( LPARAM ) ( LPCTSTR ) TEXT( "windows" ), SMTO_NORMAL, 1000, NULL ); } /* If Windows NT, use the SetDefaultPrinter API for Windows 2000, or WriteProfileString for version 4.0 and earlier. */ else if( hb_iswinnt() ) { if( hb_iswin2k() ) /* Windows 2000 or later (use explicit call) */ { HMODULE hWinSpool; typedef BOOL ( WINAPI * DEFPRINTER )( LPCTSTR ); /* stops warnings */ DEFPRINTER fnSetDefaultPrinter; hWinSpool = hbwapi_LoadLibrarySystem( TEXT( "winspool.drv" ) ); if( ! hWinSpool ) return HB_FALSE; fnSetDefaultPrinter = ( DEFPRINTER ) HB_WINAPI_GETPROCADDRESST( hWinSpool, "SetDefaultPrinter" ); if( ! fnSetDefaultPrinter ) { FreeLibrary( hWinSpool ); return HB_FALSE; } bFlag = ( *fnSetDefaultPrinter )( lpPrinterName ); FreeLibrary( hWinSpool ); if( ! bFlag ) return HB_FALSE; } else /* NT4.0 or earlier */ { HB_ISIZ nStrLen; /* Open this printer so you can get information about it. */ bFlag = OpenPrinter( ( LPTSTR ) lpPrinterName, &hPrinter, NULL ); if( ! bFlag || ! hPrinter ) return HB_FALSE; /* The first GetPrinter() tells you how big our buffer must be to hold ALL of PRINTER_INFO_2. Note that this will typically return FALSE. This only means that the buffer (the 3rd parameter) was not filled in. You do not want it filled in here. */ SetLastError( 0 ); bFlag = GetPrinter( hPrinter, 2, 0, 0, &dwNeeded ); if( ! bFlag ) { if( ( GetLastError() != ERROR_INSUFFICIENT_BUFFER ) || ( dwNeeded == 0 ) ) { ClosePrinter( hPrinter ); return HB_FALSE; } } /* Allocate enough space for PRINTER_INFO_2. */ ppi2 = ( PRINTER_INFO_2 * ) hb_xgrab( dwNeeded ); /* The second GetPrinter() fills in all the current information. */ bFlag = GetPrinter( hPrinter, 2, ( LPBYTE ) ppi2, dwNeeded, &dwNeeded ); if( ( ! bFlag ) || ( ! ppi2->pDriverName ) || ( ! ppi2->pPortName ) ) { ClosePrinter( hPrinter ); hb_xfree( ppi2 ); return HB_FALSE; } nStrLen = hbwapi_tstrlen( lpPrinterName ) + hbwapi_tstrlen( ppi2->pDriverName ) + hbwapi_tstrlen( ppi2->pPortName ) + 2; /* Allocate buffer big enough for concatenated string. String will be in form "printername,drivername,portname". */ pBuffer = ( LPTSTR ) hb_xgrab( ( nStrLen + 1 ) * sizeof( TCHAR ) ); pBuffer[ 0 ] = TEXT( '\0' ); /* Build string in form "printername,drivername,portname". */ hbwapi_tstrncat( pBuffer, lpPrinterName, nStrLen ); hbwapi_tstrncat( pBuffer, TEXT( "," ), nStrLen ); hbwapi_tstrncat( pBuffer, ppi2->pDriverName, nStrLen ); hbwapi_tstrncat( pBuffer, TEXT( "," ), nStrLen ); hbwapi_tstrncat( pBuffer, ppi2->pPortName, nStrLen ); /* Set the default printer in win.ini and registry. */ bFlag = WriteProfileString( TEXT( "windows" ), TEXT( "device" ), pBuffer ); if( ! bFlag ) { ClosePrinter( hPrinter ); hb_xfree( ppi2 ); hb_xfree( pBuffer ); return HB_FALSE; } } /* Tell all open programs that this change occurred. Allow each app 1 second to handle this message. */ SendMessageTimeout( HWND_BROADCAST, WM_SETTINGCHANGE, 0L, 0L, SMTO_NORMAL, 1000, NULL ); } /* Clean up. */ if( hPrinter ) ClosePrinter( hPrinter ); if( ppi2 ) hb_xfree( ppi2 ); if( pBuffer ) hb_xfree( pBuffer ); return HB_TRUE; #else HB_SYMBOL_UNUSED( lpPrinterName ); return HB_FALSE; #endif }
char * hb_verPlatform( void ) { char * pszPlatform; HB_TRACE( HB_TR_DEBUG, ( "hb_verPlatform()" ) ); pszPlatform = ( char * ) hb_xgrab( PLATFORM_BUF_SIZE + 1 ); #if defined( HB_OS_DOS ) { union REGS regs; regs.h.ah = 0x30; HB_DOS_INT86( 0x21, ®s, ®s ); hb_snprintf( pszPlatform, PLATFORM_BUF_SIZE + 1, "DOS %d.%02d", regs.h.al, regs.h.ah ); /* Host OS detection: Windows 2.x, 3.x, 95/98 */ { regs.HB_XREGS.ax = 0x1600; HB_DOS_INT86( 0x2F, ®s, ®s ); if( regs.h.al != 0x00 && regs.h.al != 0x80 ) { char szHost[ 128 ]; if( regs.h.al == 0x01 || regs.h.al == 0xFF ) hb_snprintf( szHost, sizeof( szHost ), " (Windows 2.x)" ); else hb_snprintf( szHost, sizeof( szHost ), " (Windows %d.%02d)", regs.h.al, regs.h.ah ); hb_strncat( pszPlatform, szHost, PLATFORM_BUF_SIZE ); } } /* Host OS detection: Windows NT family */ { regs.HB_XREGS.ax = 0x3306; HB_DOS_INT86( 0x21, ®s, ®s ); if( regs.HB_XREGS.bx == 0x3205 ) hb_strncat( pszPlatform, " (Windows NT)", PLATFORM_BUF_SIZE ); } /* Host OS detection: OS/2 */ { regs.h.ah = 0x30; HB_DOS_INT86( 0x21, ®s, ®s ); if( regs.h.al >= 10 ) { char szHost[ 128 ]; if( regs.h.al == 20 && regs.h.ah > 20 ) hb_snprintf( szHost, sizeof( szHost ), " (OS/2 %d.%02d)", regs.h.ah / 10, regs.h.ah % 10 ); else hb_snprintf( szHost, sizeof( szHost ), " (OS/2 %d.%02d)", regs.h.al / 10, regs.h.ah ); hb_strncat( pszPlatform, szHost, PLATFORM_BUF_SIZE ); } } } #elif defined( HB_OS_OS2 ) { unsigned long aulQSV[ QSV_MAX ] = { 0 }; APIRET rc = DosQuerySysInfo( 1L, QSV_MAX, ( void * ) aulQSV, sizeof( ULONG ) * QSV_MAX ); if( rc == 0 ) { /* is this OS/2 2.x ? */ if( aulQSV[ QSV_VERSION_MINOR - 1 ] < 30 ) hb_snprintf( pszPlatform, PLATFORM_BUF_SIZE + 1, "OS/2 %ld.%02ld", aulQSV[ QSV_VERSION_MAJOR - 1 ] / 10, aulQSV[ QSV_VERSION_MINOR - 1 ] ); else hb_snprintf( pszPlatform, PLATFORM_BUF_SIZE + 1, "OS/2 %2.2f", ( float ) aulQSV[ QSV_VERSION_MINOR - 1 ] / 10 ); } else hb_snprintf( pszPlatform, PLATFORM_BUF_SIZE + 1, "OS/2" ); } #elif defined( HB_OS_WIN ) { const char * pszName = ""; OSVERSIONINFO osvi; memset( &osvi, 0, sizeof( osvi ) ); #if defined( HB_OS_WIN_CE ) pszName = " CE"; osvi.dwOSVersionInfoSize = sizeof( osvi ); GetVersionEx( &osvi ); #else /* Detection of legacy Windows versions */ switch( hb_iswin9x() ) { case 5: osvi.dwMajorVersion = 4; osvi.dwMinorVersion = 0; pszName = " 95"; break; case 8: osvi.dwMajorVersion = 4; osvi.dwMinorVersion = 10; pszName = " 98"; break; case 9: osvi.dwMajorVersion = 4; osvi.dwMinorVersion = 90; pszName = " ME"; break; } #endif if( pszName[ 0 ] == '\0' ) { #if defined( HB_OS_WIN_CE ) pszName = " CE"; #else if( hb_iswinver( 11, 0, 0, HB_TRUE ) ) { osvi.dwMajorVersion = 11; osvi.dwMinorVersion = 0; pszName = " 11 or newer"; } else if( hb_iswin10() ) { osvi.dwMajorVersion = 10; osvi.dwMinorVersion = 0; if( hb_iswinver( 10, 0, VER_NT_WORKSTATION, HB_FALSE ) ) pszName = " 10"; else pszName = " Server 2016"; } else if( hb_iswin81() ) { osvi.dwMajorVersion = 6; osvi.dwMinorVersion = 3; if( hb_iswinver( 6, 3, VER_NT_WORKSTATION, HB_FALSE ) ) pszName = " 8.1"; else pszName = " Server 2012 R2"; } else if( hb_iswinvista() ) { if( hb_iswin8() ) { osvi.dwMajorVersion = 6; osvi.dwMinorVersion = 2; if( hb_iswinver( 6, 2, VER_NT_WORKSTATION, HB_FALSE ) ) pszName = " 8"; else pszName = " Server 2012"; } else if( hb_iswinver( 6, 1, 0, HB_FALSE ) ) { osvi.dwMajorVersion = 6; osvi.dwMinorVersion = 1; if( hb_iswinver( 6, 1, VER_NT_WORKSTATION, HB_FALSE ) ) pszName = " 7"; else pszName = " Server 2008 R2"; } else { osvi.dwMajorVersion = 6; osvi.dwMinorVersion = 0; if( hb_iswinver( 6, 0, VER_NT_WORKSTATION, HB_FALSE ) ) pszName = " Vista"; else pszName = " Server 2008"; } } else if( hb_iswinver( 5, 2, 0, HB_FALSE ) ) { osvi.dwMajorVersion = 5; osvi.dwMinorVersion = 2; if( hb_iswinver( 5, 2, VER_NT_WORKSTATION, HB_FALSE ) ) pszName = " XP x64"; else if( GetSystemMetrics( SM_SERVERR2 ) != 0 ) pszName = " Server 2003 R2"; else pszName = " Server 2003"; } else if( hb_iswinver( 5, 1, 0, HB_FALSE ) ) { osvi.dwMajorVersion = 5; osvi.dwMinorVersion = 1; pszName = " XP"; } else if( hb_iswin2k() ) { osvi.dwMajorVersion = 5; osvi.dwMinorVersion = 0; pszName = " 2000"; } else pszName = " NT"; #endif } hb_snprintf( pszPlatform, PLATFORM_BUF_SIZE + 1, "Windows%s%s %lu.%lu", pszName, s_iWine ? " (Wine)" : "", osvi.dwMajorVersion, osvi.dwMinorVersion ); /* Add service pack/other info */ if( hb_iswin2k() ) { int tmp; for( tmp = 5; tmp > 0; --tmp ) { if( hb_iswinsp( tmp, HB_TRUE ) ) { char szServicePack[ 8 ]; hb_snprintf( szServicePack, sizeof( szServicePack ), " SP%u", tmp ); hb_strncat( pszPlatform, szServicePack, PLATFORM_BUF_SIZE ); break; } } } #if defined( HB_OS_WIN_CE ) else { /* Also for Win9x and NT, but GetVersionEx() is deprecated so we avoid it. */ if( osvi.szCSDVersion[ 0 ] != TEXT( '\0' ) ) { char * pszCSDVersion = HB_OSSTRDUP( osvi.szCSDVersion ); int i; /* Skip the leading spaces (Win95B, Win98) */ for( i = 0; pszCSDVersion[ i ] != '\0' && HB_ISSPACE( ( int ) pszCSDVersion[ i ] ); i++ ) ; if( pszCSDVersion[ i ] != '\0' ) { hb_strncat( pszPlatform, " ", PLATFORM_BUF_SIZE ); hb_strncat( pszPlatform, pszCSDVersion + i, PLATFORM_BUF_SIZE ); } hb_xfree( pszCSDVersion ); } } #endif } #elif defined( __CEGCC__ ) { hb_snprintf( pszPlatform, PLATFORM_BUF_SIZE + 1, "Windows CE" ); } #elif defined( HB_OS_UNIX ) { struct utsname un; uname( &un ); #if defined( HB_OS_MINIX ) hb_snprintf( pszPlatform, PLATFORM_BUF_SIZE + 1, "%s Release %s Version %s %s", un.sysname, un.release, un.version, un.machine ); #else hb_snprintf( pszPlatform, PLATFORM_BUF_SIZE + 1, "%s %s %s", un.sysname, un.release, un.machine ); #endif } #else { hb_strncpy( pszPlatform, "(unrecognized)", PLATFORM_BUF_SIZE ); } #endif return pszPlatform; }
static void hb_GetDefaultPrinter( PHB_ITEM pPrinterName ) { #if ! defined( HB_OS_WIN_CE ) HB_BOOL bResult = HB_FALSE; hb_itemPutC( pPrinterName, NULL ); if( hb_iswin2k() ) /* Windows 2000 or later */ { typedef BOOL( WINAPI * DEFPRINTER ) ( LPTSTR, LPDWORD ); DEFPRINTER fnGetDefaultPrinter; HMODULE hWinSpool = hbwapi_LoadLibrarySystem( TEXT( "winspool.drv" ) ); if( hWinSpool ) { fnGetDefaultPrinter = ( DEFPRINTER ) GetProcAddress( hWinSpool, HB_WINAPI_FUNCTION_NAME( "GetDefaultPrinter" ) ); if( fnGetDefaultPrinter ) { TCHAR lpPrinterName[ 256 ]; DWORD dwSize = HB_SIZEOFARRAY( lpPrinterName ) - 1; bResult = ( *fnGetDefaultPrinter )( lpPrinterName, &dwSize ); HB_ITEMPUTSTR( pPrinterName, lpPrinterName ); } FreeLibrary( hWinSpool ); } } if( ! bResult ) /* Win9x and Windows NT 4.0 or earlier & 2000+ if necessary for some reason i.e. dll could not load! */ { TCHAR lpPrinterName[ 256 ]; DWORD dwSize = GetProfileString( TEXT( "windows" ), TEXT( "device" ), TEXT( "" ), lpPrinterName, ( DWORD ) HB_SIZEOFARRAY( lpPrinterName ) - 1 ); if( dwSize && dwSize < HB_SIZEOFARRAY( lpPrinterName ) ) { dwSize = 0; while( lpPrinterName[ dwSize ] != '\0' && lpPrinterName[ dwSize ] != ',' ) dwSize++; lpPrinterName[ dwSize ] = '\0'; bResult = HB_TRUE; HB_ITEMPUTSTRLEN( pPrinterName, lpPrinterName, dwSize ); } } if( ! bResult && hb_iswin9x() ) { /* This option should never be required but is included because of this article http://support.microsoft.com/kb/246772/en-us This option will not enumerate any network printers. From the SDK technical reference for EnumPrinters(); If Level is 2 or 5, Name is a pointer to a null-terminated string that specifies the name of a server whose printers are to be enumerated. If this string is NULL, then the function enumerates the printers installed on the local machine. */ DWORD dwNeeded = 0, dwReturned = 0; if( EnumPrinters( PRINTER_ENUM_DEFAULT, NULL, 2, NULL, 0, &dwNeeded, &dwReturned ) ) { if( dwNeeded ) { PRINTER_INFO_2 * pPrinterInfo = ( PRINTER_INFO_2 * ) hb_xgrab( dwNeeded ); if( EnumPrinters( PRINTER_ENUM_DEFAULT, NULL, 2, ( LPBYTE ) pPrinterInfo, dwNeeded, &dwNeeded, &dwReturned ) && dwReturned ) HB_ITEMPUTSTR( pPrinterName, pPrinterInfo->pPrinterName ); hb_xfree( pPrinterInfo ); } } } #else hb_itemPutC( pPrinterName, NULL ); #endif }