Форум » [x]Harbour » Как определить версию ОС Win7 ? » Ответить

Как определить версию ОС Win7 ?

Andrey: Всем привет ! Как определить версию ОС свежих систем Vista, Win7 32бит или 64бит ? Можно ли определить версию ОС если запускаешь программу в эмуляторе Windows под Lunix'ом ? Т.е. в какой системе запущено, в эмуляторе или нормальной ОС ?

Ответов - 25, стр: 1 2 All

Петр: Как определить версию ОС свежих систем Vista, Win7 Проверить, что возвращают функции os_isWinVista(), os_isWin2003(), os_isWin7() и т.п. 32бит или 64бит Проверкой переменных PROCESSOR_ARCHITECTURE и PROCESSOR_ARCHITEW6432 Что и как нужно проверять (взял из нета) 1) PROCESSOR_ARCHITECTURE=x86 и PROCESSOR_ARCHITEW6432 не определен - 32-х разрядная система 2) PROCESSOR_ARCHITECTURE=AMD64 и PROCESSOR_ARCHITEW6432 не определен - 64-х разрядная система на базе x64, программа запущена в родном режиме (64-х битном) 3) PROCESSOR_ARCHITECTURE=IA64 и PROCESSOR_ARCHITEW6432 не определен - 64-х разрядная система на базе Itanium, программа запущена в родном режиме (64-х битном) 4) PROCESSOR_ARCHITECTURE=x86 и PROCESSOR_ARCHITEW6432=AMD64 - 64-х разрядная система на базе x64, программа запущена в режиме x86 4) PROCESSOR_ARCHITECTURE=x86 и PROCESSOR_ARCHITEW6432=IA64 - 64-х разрядная система на базе Itanium, программа запущена в режиме эмуляции x86 Алгоритм только для x64 от Microsoft: IF ((PROCESSOR_ARCHITECTURE == AMD64) OR (PROCESSOR_ARCHITEW6432 == AMD64)) THEN // 64-х битная ОС ELSE // 32-х битная ОС END IF На всякий случай напомню: проверять с помощью GetEnv()

Петр: Andrey пишет: Можно ли определить версию ОС если запускаешь программу в эмуляторе Windows под Lunix'ом ? Т.е. в какой системе запущено, в эмуляторе или нормальной ОС ? Здесь два разных вопроса, а не вопрос и его уточнение. К тому же не указывается какой используется эмулятор, а их не один и даже не два. Отвечу для Wine. С помощью настройки конфигурационных файлов вы можете попробовать убедить запускаемую программу, что она выполняется именно в определенной версии Win. Для проверки того, выполняется программа в Wine или нет лучше воспользоваться сл. кодом [pre2]procedure main() ? is_wine() return #pragma begindump #include "hbapi.h" #include "windows.h" #ifdef __XHARBOUR__ #define HB_FALSE FALSE #endif HB_FUNC( IS_WINE ) { HMODULE module = GetModuleHandle("ntdll.dll"); if (!module) hb_retl( HB_FALSE ); else hb_retl( GetProcAddress(module, "wine_server_call") != NULL ); } #pragma enddump[/pre2]

Andrey: Спасибо Петр !


Andrey: Andrey пишет: os_isWin7() Нет такой функции -> Error: Unresolved external '_HB_FUN_OS_ISWIN7' referenced from ...... Я пользуюсь xHarbour 1.0.0 Перейти на другую версию пока не могу ! Можно ли отдельную С-ную вставку получить ? Или откуда взять можно ?

gfilatov2002: Andrey пишет: Можно ли отдельную С-ную вставку получить ? Лови #pragma BEGINDUMP #include <windows.h> #define HB_OS_WIN_USED #include "hbapiitm.h" static void getwinver( OSVERSIONINFO * pOSvi ) { pOSvi->dwOSVersionInfoSize = sizeof( OSVERSIONINFO ); GetVersionEx ( pOSvi ); } HB_FUNC( OS_ISWINNT ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwPlatformId == VER_PLATFORM_WIN32_NT ); } HB_FUNC( OS_ISWIN9X ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ); } HB_FUNC( OS_ISWIN95 ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0 ); } HB_FUNC( OS_ISWIN98 ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10 ); } HB_FUNC( OS_ISWINME ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90 ); } HB_FUNC( OS_ISWINNT351 ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion == 3 && osvi.dwMinorVersion == 51 ); } HB_FUNC( OS_ISWINNT4 ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0 ); } HB_FUNC( OS_ISWIN2000 ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ); } HB_FUNC( OS_ISWINXP ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ); } HB_FUNC( OS_ISWIN2003 ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 ); } HB_FUNC( OS_ISWINVISTA ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 ); } HB_FUNC( OS_ISWIN7 ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1 ); } HB_FUNC( OS_ISWTSCLIENT ) { int iResult = FALSE; OSVERSIONINFO osvi; getwinver( &osvi ); if ( osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion >= 4 ) { // Only supported on NT Ver 4.0 SP3 & higher #ifndef SM_REMOTESESSION #define SM_REMOTESESSION 0x1000 #endif iResult = GetSystemMetrics(SM_REMOTESESSION) ; } hb_retl( iResult ); } HB_FUNC( OS_ISWIN2000_OR_LATER ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwMajorVersion >= 5 ); } HB_FUNC( OS_ISWINXP_OR_LATER ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwMajorVersion > 5 || (osvi.dwMajorVersion==5 && osvi.dwMinorVersion >= 1) ); } HB_FUNC( OS_ISWINVISTA_OR_LATER ) { OSVERSIONINFO osvi; getwinver( &osvi ); hb_retl( osvi.dwMajorVersion >= 6 ); } HB_FUNC( OS_VERSIONINFO ) { OSVERSIONINFO osvi; PHB_ITEM pArray = hb_itemArrayNew( 5 ); getwinver( &osvi ); hb_arraySetNL( pArray, 1, osvi.dwMajorVersion ); hb_arraySetNL( pArray, 2, osvi.dwMinorVersion ); if ( osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) { osvi.dwBuildNumber = LOWORD( osvi.dwBuildNumber ); } hb_arraySetNL( pArray, 3, osvi.dwBuildNumber ); /* #define VER_PLATFORM_WIN32s 0 #define VER_PLATFORM_WIN32_WINDOWS 1 #define VER_PLATFORM_WIN32_NT 2 */ hb_arraySetNL( pArray, 4, osvi.dwPlatformId ); hb_arraySetC( pArray, 5, osvi.szCSDVersion ); hb_itemRelease( hb_itemReturn( pArray) ); } HB_FUNC( OS_ISUSERANADMIN ) // 24/11/09 11:43 { BOOL iResult = FALSE ; typedef int (WINAPI *USERADMIN)( void ); HINSTANCE hLib; USERADMIN ProcAdd; hLib = LoadLibrary("shell32.dll"); if (hLib != NULL) { ProcAdd = ( USERADMIN ) GetProcAddress(hLib, "IsUserAnAdmin"); if (NULL != ProcAdd) { iResult = (ProcAdd)() ; } FreeLibrary( hLib ); } hb_retl( iResult ) ; } #pragma ENDDUMP

Pasha: Эта функция добавлена в xHarbour в ноябре 2009 года

Andrey: Добавил в свой проект этот исходник. Теперь выдает: Error: Unresolved external '_hb_arraySetNL' referenced from Error: Unresolved external '_hb_arraySetC' referenced from

gfilatov2002: Andrey пишет: Error: Unresolved external '_hb_arraySetNL' referenced from Error: Unresolved external '_hb_arraySetC' referenced from Просто удали из своего исходника функцию OS_VERSIONINFO

Andrey: Спасибо БОЛЬШОЕ, Григорий !

Andrey: А что за функция OS_ISUSERANADMIN ? Для чего она нужна ?

Петр: Andrey пишет: OS_ISUSERANADMIN ? Для чего она нужна ? С помощью этой функции вы могёте определить - текущий пользователь имеет права администратора или нет ИМХО, оставаться на xHb 1.0 плохая идея

Andrey: Петр пишет: оставаться на xHb 1.0 плохая идея Спасибо Петр ! Как с драйвером экрана разберусь, так перейду на 1.2 !

Gen: А нет ли готовой функции чтоб определить какая ОС установлена на компе ? Или придется перебирать ВСЕ вхождения: IF OS_ISWIN98 RETURN "WIN98" ..... IF OS_ISWIN2003 RETURN "WIN2003" IF OS_ISWIN7 RETURN "WIN7"

rvu: Не появилось нового способа отличить 32-х от 64-х разрядной? Петр пишет: 1) PROCESSOR_ARCHITECTURE=x86 и PROCESSOR_ARCHITEW6432 не определен - 32-х разрядная система У меня это показывает на 64-х. Петр пишет: Проверить, что возвращают функции os_isWinVista(), os_isWin2003(), os_isWin7() и т.п. Видимо, os_isWinXP() тоже есть. За неимением XP под рукой проверить на ней не могу, но на 7-ке, она возвращает .F. А под 10-ку еще ничего не появилось?

Pasha: Уже есть функция HB_OSIS64BIT()

Sergy: В 64-битных версиях Windows есть переменные окружения ProgramFiles(x86)=C:\Program Files (x86) ProgramW6432=C:\Program Files В 32-битных их нет.

Andrey: gfilatov2002 пишет: HB_FUNC( OS_ISUSERANADMIN ) // 24/11/09 11:43 { BOOL iResult = FALSE ; typedef int (WINAPI *USERADMIN)( void ); HINSTANCE hLib; USERADMIN ProcAdd; hLib = LoadLibrary("shell32.dll"); if (hLib != NULL) { ProcAdd = ( USERADMIN ) GetProcAddress(hLib, "IsUserAnAdmin"); if (NULL != ProcAdd) { iResult = (ProcAdd)() ; } FreeLibrary( hLib ); } hb_retl( iResult ) ; } #pragma ENDDUMP Использую эту функцию у себя. На Win10 выдаёт сейчас .F. при запуске. У меня админские права, а выдаёт .F. Почему ?

PSP: Andrey пишет: Использую эту функцию у себя. На Win10 выдаёт сейчас .F. при запуске. У меня админские права, а выдаёт .F. А ты явно запусти от имени Администратора. Что будет?

Andrey: Не могу. На компе только я.

Andrey: Как получить какие права имеет юзер, т.е. где запускается моя программа ?

PSP: Andrey пишет: Не могу. На компе только я Чё тут мочь? Это неважно, что в винде ты числишься администратором. По-умолчанию, десятка не дает прав админа при запуске. Ты всё-таки проверь: ПраваяКнопкаМыши - Запустить от имени администратора.

Andrey: PSP пишет: По-умолчанию, десятка не дает прав админа при запуске. Ты всё-таки проверь: ПраваяКнопкаМыши - Запустить от имени администратора. Да, точно не даёт. Запуск от имени администратора выдаёт правильно .T. А я и не обращал на это внимание...

PSP: Andrey пишет: Да, точно не даёт. А теперь, если конечно хочешь, сделай изменения в реестре. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorAdmin поставь в 0 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA поставь в 0 и перезагрузи комп. Это позволит использовать полные права всегда без запроса.

SergKis: Andrey А тебе это зачем в задаче ? Систему хочешь снести с правами ? У тебя usera (и ты в том числе) с правами устанавливаемые для задачи, а не для системы, по мну так

Andrey: PSP пишет: А теперь, если конечно хочешь, сделай изменения в реестре. Нет, спасибо но не буду. SergKis пишет: А тебе это зачем в задаче ? Для установки драйверов HASP. А для обычных задач конечно это не надо.



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