Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно
MKN MKN вне форума

Ветеран


Сообщения: 2358
Благодарности: 559

Профиль | Отправить PM | Цитировать


wolkow70,
Можно ещё проще, без канители с конвертированием. ( Я ведь такой код уже выкладывал в прошлом году... )
Код: Выделить весь код
System::Call  "netapi32::NetWkstaGetInfo(i0, i100, *i r0 r0) i.r6"
System::Call  "*$0(i.r1, w.r2, w.r3, i.r4, i.r5)"
MessageBox MB_OK "$2 $3 domain (platform_id $1 - ver OS $4.$5) "
System::Call  "netapi32::NetApiBufferFree(*i r0) i.r6"
но, как рекомендуют, если вдруг функция выполнится с ошибкой , так :
Код: Выделить весь код
!include LogicLib.nsh
System::Call "netapi32::NetWkstaGetInfo(i0, i100, *i 0 r0) i.r1"
${If} 0 = $1
System::Call "*$0(i.r1, w.r2, w.r3, i.r4, i.r5)"
MessageBox MB_OK "$2 $3 domain (platform_id $1 - ver OS $4.$5) "
${EndIf}
${IfThen} $0 <> 0 ${|} System::Call "netapi32::NetApiBufferFree(ir0)" ${|}
Есть ещё такой занятный код - версия ОС берётся из ресурсов какой-либо системной DLL, например из kernel32.dll.
Работает в Win10

Код: Выделить весь код
Outfile "OS-Info_test.exe"

!ifndef RT_VERSION
!define RT_VERSION      16
!endif
!ifndef VS_FILE_INFO
!define VS_FILE_INFO    ${RT_VERSION}
!endif
!ifndef VS_VERSION_INFO
!define VS_VERSION_INFO 1
!endif

Section
    StrCpy $R0 0
    System::Call 'kernel32::LoadLibrary(t"kernel32.dll")p.R1'   ;  System::Call "kernel32::LoadLibrary(t '\path\your.dll(exe)') i .r0"
    IntCmp $R1 0 error
    System::Call 'kernel32::FindResource(pR1,p${VS_VERSION_INFO},p${VS_FILE_INFO})p.R2'
    IntCmp $R2 0 ok
    System::Call 'kernel32::LoadResource(pR1,pR2)p.R3'
    IntCmp $R3 0 ok
    System::Call 'kernel32::LockResource(pR3)p.R4'
    IntCmp $R4 0 ok
    System::Call "*$R4(&i2,&i2.R5,&i2,&w16,&i2,i,i,i.R6)"
    IntCmp $R5 0 ok
    IntFmt $R0 "0x%08X" $R6
ok:
    System::Call "kernel32::FreeLibrary(pR1)"
error:
IntOp $0 $R0 >> 16
IntOp $1 $R0 & 0xFFFF
DetailPrint "$0.$1"
MessageBox MB_OK "ver $0.$1"
SectionEnd
Этот код можно использовать для определения версий не только DLL, но и EXE.
Жаль, что только до одного знака подверсии... Возможно можно как то подкорректировтаь...

Также интересна функция System::Call 'ntdll::RtlGetVersion , работающая в Win10
Но с её синтаксисом я не разобрался...

Последний раз редактировалось MKN, 29-10-2015 в 11:04.


Отправлено: 10:34, 29-10-2015 | #1872