Ir al contenido


Foto

Compilación condicional


  • Por favor identifícate para responder
8 respuestas en este tema

#1 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 25 junio 2014 - 07:28

Buenas, tengo un dilema.
Resulta que tengo que incluir una unit si el ejecutable está corriendo en Win7 o Win8, caso contrario no se incluye.
Tengo entendido que se hace con los condicionales.
¿Alguien me puede dar una mano? Gracias.



delphi
  1. {$IfDef DefName} //Esto debería indicarme si estoy en Win7 o Win8 o en ninguno.
  2. thinfinity,
  3. {$Else}
  4. system, controls, ...
  5. {$EndIf}


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.301 mensajes
  • LocationArgentina

Escrito 25 junio 2014 - 07:56

Ummm, la verdad es que no recuerdo que existieran flags condicionales para las versiones de cada SO en Delphi. Si existen para detectar si se emplea Windows, Mac o Android.
Aunque no podría asegurarlo, puesto que tengo un vago recuerdo de cuando estuve dando una ojeada a ciertas unidades que vienen en Lazarus haber visto partes de código llenas de condicionales para cada caso de SO y versiones.

Lamentablemente no dispongo de Delphi ni de Lazarus como para comprobarlo.
La wiki de Embarcadero sobre las directivas condicionales no dice nada al respecto de flags para versiones de SO. Está el listado completo y al menos yo no encontré algo al respecto.  :(

Saludos,
  • 0

#3 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 26 junio 2014 - 06:56

nlsGarcia respondió, está bueno pero hay que leer...  :s

Su respuesta está aquí. http://www.clubdelph...324&postcount=3
La comparto para todos los que tengan dudas al respecto de las condicionales.

Santiago.
  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 26 junio 2014 - 07:08

¿Quieres compilar diferente según la máquina en la que COMPILES?

Yo uso cosas similares pero en tiempo de ejecución: Si estas ejecutando el exe en un win7 haz esto y si no haz aquello (bueno, lo usaba para Win98, XP, etc donde se notaba mucho, el 98 no era un NT disfrazado, era una cosa diferente).

En cualquier caso, en tiempo de compilación no me suena que exista, pero dado que tu sabes en que máquina estas, puedes crear un include donde definas el SO que tienes, y en cada pc donde compiles poner uno diferente... no le veo la utilidad pero seguro que la tiene!
  • 0

#5 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 26 junio 2014 - 07:18

La cosa es así, hay una unit que uso, pero solamente ha sido desarrollada para Win8, si compilo en DelphiXE5 sobre Win8 y lo ejecuto , lo hace sin problemas.
Cuando llevo ese ejecutable a otra máquina (XP, Win7), no se ejecuta y devuelve un error.
La idea es que cuando esté corriendo en cierto sistema operativo, Win8, le dé bolilla a esa unit, que está en uses claro, y cuando esté corriendo en otro, no. No se si entiende. Lo mismo vale para los objetos, que están dentro del código, que son de esa unit.
Ahora que lo veo, no se si por el lado de las condicionales la cosa se encamina.

Espero haber sido claro.

Santiago.
  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 26 junio 2014 - 07:23

No tiene sentido, en este caso, una compilación condicional. Detecta en ejecución el S.O. en el que se ejecuta y ejecuta código según el S.O. encontrado.

Saludos.
  • 0

#7 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 26 junio 2014 - 07:27

¿Quieres compilar diferente según la máquina en la que COMPILES?

Yo uso cosas similares pero en tiempo de ejecución: Si estas ejecutando el exe en un win7 haz esto y si no haz aquello (bueno, lo usaba para Win98, XP, etc donde se notaba mucho, el 98 no era un NT disfrazado, era una cosa diferente).

En cualquier caso, en tiempo de compilación no me suena que exista, pero dado que tu sabes en que máquina estas, puedes crear un include donde definas el SO que tienes, y en cada pc donde compiles poner uno diferente... no le veo la utilidad pero seguro que la tiene!


Esto suena bien y me parece que es por donde hay que ir.
¿Cómo lo haces?
  • 0

#8 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 26 junio 2014 - 07:37

Si descargas el código expuesto en este ejemplo verás como hacerlo.

Saludos.
  • 0

#9 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 26 junio 2014 - 02:43

Para dar más información, revisa la API GetVersionEx y la estructura OSVERSIONINFO



delphi
  1. function IsWin8: boolean;
  2. var
  3.   VerInfo: TOSVersioninfo;
  4. begin
  5.   VerInfo.dwOSVersionInfoSize:= SizeOf(TOSVersionInfo);
  6.   GetVersionEx(VerInfo);
  7.   Result:= (VerInfo.dwMajorVersion >= 6) and (VerInfo.dwMinorVersion >= 2);
  8. end;



Nota importante:
El código anterior dará WinXP(5.1) si corres por ejemplo delphi7 en Win8 en modo de compatibilidad WinXP durante el debug, pero la aplicación ya compilada reconocerá Win8 sin error


Saludos.

  • 0




IP.Board spam blocked by CleanTalk.