PDA

Ver la Versión Completa : Api GetVersionEx


agonzalez
07-09-2004, 00:54:06
Tengo implementada la api GetVersionEx en delphi y me funciona sin problemas, pero en VB no me detecta el sistema operativo XP , ¿si es la misma api y la misma estructura de la funcion por que no funciona igual?, ¿Alguien sabe como detecto sistema operativo XP con VB me podria ayudar?

Gracias

Este es el codigo en VB

Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long

Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type

Enum TipoSO
cOsUnknown = 1
cOsWin95 = 2
cOsWin98 = 3
cOsWin98SE = 4
cOsWinME = 5
cOsWinNT = 6
cOsWin2000 = 7
cOsWinXP = 8
End Enum

Type SYSTEM_INFO
dwOemID As Long
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOrfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
dwReserved As Long
End Type

Public Function SistemaOperativo() As String
Dim osVersion As OSVERSIONINFO
Dim Major As Integer
Dim Minor As Integer
Dim Version As Integer
osVersion.dwOSVersionInfoSize = MAX_LENGTH
If (GetVersionEx(osVersion)) Then
Major = osVersion.dwMajorVersion
Minor = osVersion.dwMinorVersion
Select Case osVersion.dwPlatformId
Case VER_PLATFORM_WIN32_NT 'Windows NT/2000/XP
If (Major <= 4) Then
Version = cOsWinNT
Else
If (Major = 5) And (Minor = 0) Then
Version = cOsWin2000
Else
If (Major = 5) And (Minor = 1) Then
Version = cOsWinXP
Else
Version = cOsUnknown
End If
End If
End If
Case VER_PLATFORM_WIN32_WINDOWS 'Windows 9x/ME
If (Major = 4) And (Minor = 0) Then
Version = cOsWin95
Else
If (Major = 4) And (Minor = 10) Then
If (Mid(osVersion.szCSDVersion, 1, 1) = "A") Then
Version = cOsWin98SE
Else
Version = cOsWin98
End If
Else
If (Major = 4) And (Minor = 90) Then
Version = cOsWinME
Else
Version = cOsUnknown
End If
End If
End If
Case Else
Version = cOsUnknown
End Select
Else
Version = cOsUnknown
End If

Select Case Version
Case cOsUnknown
SistemaOperativo = "(sistema no reconocido)"
Case cOsWin95
SistemaOperativo = "Microsoft Windows 95"
Case cOsWin98
SistemaOperativo = "Microsoft Windows 98"
Case cOsWin98SE
SistemaOperativo = "Microsoft Windows 98 Second Edition"
Case cOsWinME
SistemaOperativo = "Microsoft Windows Millennium Edition"
Case cOsWinNT
SistemaOperativo = "Microsoft Windows NT"
Case cOsWin2000
SistemaOperativo = "Microsoft Windows 2000"
Case cOsWinXP
SistemaOperativo = "Microsoft Windows XP"
Case Else
SistemaOperativo = "Microsoft Windows"
End Select
End Function

y este es mi codigo en delphi

function Tlog.FNombreSO:String;
const
cOsUnknown=1;
cOsWin95=2;
cOsWin98=3;
cOsWin98SE=4;
cOsWinME=5;
cOsWinNT=6;
cOsWin2000=7;
cOsWinXP=8;
var
LosVersion : TOSVersionInfo;
Lmajor,
Lminor,
LVersion: Integer;
begin
LosVersion.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
if ( GetVersionEx( LosVersion ) ) then
begin
Lmajor := LosVersion.dwMajorVersion;
Lminor := LosVersion.dwMinorVersion;
case ( LosVersion.dwPlatformId ) of
VER_PLATFORM_WIN32_NT : { Windows NT/2000/XP }
begin
if (Lmajor<=4) then
LVersion:=cOsWinNT
else
if ((Lmajor=5) and (Lminor=0)) then
LVersion:=cOsWin2000
else
if ((Lmajor = 5) and (Lminor=1)) then
LVersion := cOsWinXP
else
LVersion:=cOsUnknown;
end;
VER_PLATFORM_WIN32_WINDOWS : { Windows 9x/ME }
begin
if ((Lmajor=4) and (Lminor=0)) then
LVersion:= cOsWin95
else
if ((Lmajor=4) and (Lminor=10)) then
begin
if (LosVersion.szCSDVersion[1]='A') then
lVersion:=cOsWin98SE
else
LVersion:=cOsWin98;
end
else
if ((Lmajor = 4) and (Lminor = 90)) then
LVersion := cOsWinME
else
LVersion := cOsUnknown;
end;
else//case
LVersion:=cOsUnknown;
end; // Final del Case
end
else
lVersion:=cOsUnknown; //Final del if
if ( lVersion=cOsUnknown ) then
Result := '(sistema no reconocido)'
else if ( lVersion = cOsWin95 ) then
Result := 'Microsoft Windows 95'
else if ( lVersion = cOsWin98 ) then
Result := 'Microsoft Windows 98'
else if ( lVersion = cOsWin98SE ) then
Result := 'Microsoft Windows 98 Second Edition'
else if ( lVersion = cOsWinME ) then
Result := 'Microsoft Windows Millennium Edition'
else if ( lVersion = cOsWinNT ) then
Result := 'Microsoft Windows NT'
else if ( lVersion = cOsWin2000 ) then
Result := 'Microsoft Windows 2000'
else if ( lVersion = cOsWinXP ) then
Result := 'Microsoft Windows XP'
else
Result := 'Microsoft Windows';
Result:= Result;
end;

jachguate
07-09-2004, 01:25:36
Hola.

No sos nuevo en el foro. Es de esperar que utilices las etiquetas [code] y/o [delphi] para publicar trozos de código. Te recomiendo editar tu mensaje si esperas que alguien se lo lea para ayudarte, ya que publicado de esta manera es mucho mas dificil de leer.

Si no sabes como usar las etiquetas, en mi firma hay un vínculo a la ayuda de code y al inicio de cada foro un mensaje que explica las nuevas etiquetas vB.

Hasta luego.

;)

Hasta luego.

roman
07-09-2004, 03:01:31
Es de esperar que utilices las etiquetas [code] y/o [delphi] para publicar trozos de código.


:eek: ¿Usar la etiqueta [delphi] para código de Visual Basic? ¡Oh sacrilegio!

:D

Y no está de más recordale al compañero agonzalez que si bien alguien puede contestarle, éstos no son foros de Visual Basic.

// Saludos

jachguate
07-09-2004, 07:13:36
:eek: ¿Usar la etiqueta [delphi] para código de Visual Basic? ¡Oh sacrilegio!


Por Dios!!!! claro que no!!! :o :o

Quizas no me expresé bien, pero me refería a usar la etiqueta [code] para vb, y la etiqueta [delphi] para Delphi.

Saludos.

;)

agonzalez
07-09-2004, 15:06:15
Tengo bien claro que no es un foro de VB, espero una respuesta desde el lado de Delphi de pronto la unit de Windows hace algún calculo adicional al que entrega la api en vB. por que de hecho hay diferencias:

Delphi me retorna un Bool, ¿que por sierto no se que es? Supongo un boolean

function GetVersionExA(var lpVersionInformation: TOSVersionInfo): BOOL; stdcall;

y en VB me retorna un Long

Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long


De ser por mi entregaba el proyecto en delphi que ya lo tengo listo , pero el arquitecto no me lo permitio.

Gracias por su atención y por su valiosa ayuda

__cadetill
07-09-2004, 15:11:48
Delphi me retorna un Bool, ¿que por sierto no se que es? Supongo un boolean
Bool, "alias" de LongBool y, de la ayuda...

A value of type ByteBool, LongBool, or WordBool is considered True when its ordinality is nonzero.


Por este motivo puedes en VB retornar un Long y desde Delphi un Bool ;)

Espero te sirva