Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-07-2013
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 291
Poder: 21
elrayo76 Va por buen camino
Función GetEnvironmentVariable

Estoy intentando usar la función GetEnvironmentVariable para poder devolver a Delphi lo que se ejecuta en el CMD.EXE del SO.

Lamentablemente todos los ejemplos de como se usa esa función que andan dando vueltas por Internet no funcionan, dado que en mi caso Delphi XE3 según la ayuda del mismo no toma los mismos parametros. Como ejemplo de lo que digo dejo el siguiente mensaje de este mismo foro para que vean los parámetros que usan en todos los casos.

http://clubdelphi.com/foros/showthread.php?t=80789

Si alguien me puede indicar como se puede usar esta función para hacer lo que necesito se los agradecería mucho. Además me gustaría saber cual es el motivo de que se le sacaron dos de los parámetros a la misma.

Saludos,
El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno
Responder Con Cita
  #2  
Antiguo 08-07-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.077
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No entiendo lo que dices, y en el enlace que has puesto dicen que funciona perfectamente
Explica exactamente qué haces, pon el código que usas (no somos adivinos), explica correctamente por qué no te funciona, copia el error te sale, etc.
Responder Con Cita
  #3  
Antiguo 08-07-2013
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Yo he usado el código de este hilo en W XP hasta W 7, en W8 no he tenido la oportunidad de probarlo.

Funciona de 10.

El hilo que haces referencia es para obtener las variables de entorno, pero de ahí no vas a obtener el resultado de un ms-dos. Son cosas distintas.

Si han quitado algo, será porque se ha modificado la API de windows,y ahí Delphi no puede hacer nada.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #4  
Antiguo 08-07-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
elrayo76,

Cita:
Empezado por elrayo76
...Estoy intentando usar la función GetEnvironmentVariable...alguien me puede indicar como se puede usar esta función...
Revisa este código:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
const
   EnvWin : array[0..26] of string =
            ('ALLUSERSPROFILE', 'APPDATA', 'CLIENTNAME',
             'COMMONPROGRAMFILES', 'COMPUTERNAME', 'COMSPEC',
             'HOMEDRIVE', 'HOMEPATH', 'LOGONSERVER',
             'NUMBER_OF_PROCESSORS','OS', 'PATH',
             'PATHEXT', 'PROCESSOR_ARCHITECTURE', 'PROCESSOR_IDENTIFIER',
             'PROCESSOR_LEVEL', 'PROCESSOR_REVISION', 'PROGRAMFILES',
             'SESSIONNAME', 'SYSTEMDRIVE', 'SYSTEMROOT',
             'TEMP', 'TMP', 'USERDOMAIN',
             'USERNAME', 'USERPROFILE', 'WINDIR'
            );

var
   i : Integer;

begin

   for i:= Low(EnvWin) to High(EnvWin) do
   begin
      ListBox1.Items.Add(Format('%s = %s',[EnvWin[i],GetEnvironmentVariable(EnvWin[i])]));
   end;

end;
El código anterior obtiene el valor de la variables de entorno de Windows en un control TListBox por medio de la función GetEnvironmentVariable y es funcional en Delphi 7, Delphi 2006 y Delphi 2010 y según entiendo también en las versiones Delphi XE*

Cita:
Empezado por elrayo76
...me gustaría saber cual es el motivo de que se le sacaron dos de los parámetros a la misma...
Te comento:

1- En Delphi, GetEnvironmentVariable es una función de SysUtils que tiene como único parámetro un string y retorna el valor de la variable de entorno de Windows indicada.

2- En Windows, GetEnvironmentVariable es una función API que retorna el valor de una variable de entorno de Windows pero con diferentes parámetros a la función de Delphi.

3- Ambas funciones GetEnvironmentVariable (Delphi y Windows) cumplen la misma función solo que en Delphi es más directa su implementación.

Te sugiero consultar estos links:
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 08-07-2013 a las 11:48:39.
Responder Con Cita
  #5  
Antiguo 08-07-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por elrayo76 Ver Mensaje
Estoy intentando usar la función GetEnvironmentVariable para poder devolver a Delphi lo que se ejecuta en el CMD.EXE del SO.
Hola.

Yo también estoy intrigado por ver el código que mediante esa función intenta obtener lo ejecutado desde el command.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 08-07-2013 a las 13:10:11.
Responder Con Cita
  #6  
Antiguo 08-07-2013
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 291
Poder: 21
elrayo76 Va por buen camino
Mas alla de lo que quiero hacer con esa función, que es lo mismo que hizo el amigo Lepe, lo que me pasa es que en Delphi XE3 esa función no tiene los mismos tres parámetros como se ve en el ejemplo de Lepe. En Delphi XE3 solo tiene un parámetro que es de tipo String.

Para que puedan ver lo que digo les voy a dejar el enlace a la documentación de Embarcadero donde esta esta función.
http://docwiki.embarcadero.com/Libra...onmentVariable

Además como se puede ver en la documentación de Microsoft esta API tiene 3 parámetros:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx.

Entonces porque cuando Embarcadero hizo la función le saco dos de esos parámetros.

Si alguien me puede decir como usar esa nueva función o si tengo que bajar alguna actualización para Delphi XE3 para corregir este error se los agradecería

nlsgarcia, si te fijas en los enlaces que tu mandas en tu mensaje, lo que dice Microsoft de la API y lo que esta implementado por Embarcadero para el uso de esa API no coincide para nada en los parámetros. A esto es a lo que me refiero. Yo la he usado por los códigos que saque de Internet con tres parámetros y en Delphi XE3 da error porque solo acepta uno.

Si es como tu dices que funciona en delphi, ¿porque no existe código alguno en la Web con esta función y si con la que tiene los tres parámetros y que no existe en ninguna de las units de Delphi en ninguna de sus versiones desde la 7 en adelante. O es que todos usan la API y nadie dice de donde la llaman?

Igualmente agradesco todo lo que han comentado porque si bien lo conosco a otro le puede ser de utilidad.

Saludos,
El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno

Última edición por elrayo76 fecha: 08-07-2013 a las 15:12:15.
Responder Con Cita
  #7  
Antiguo 08-07-2013
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.110
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Cita:
Empezado por elrayo76 Ver Mensaje
Mas alla de lo que quiero hacer con esa función, que es lo mismo que hizo el amigo Lepe, lo que me pasa es que en Delphi XE3 esa función no tiene los mismos tres parámetros como se ve en el ejemplo de Lepe. En Delphi XE3 solo tiene un parámetro que es de tipo String.

Para que puedan ver lo que digo les voy a dejar el enlace a la documentación de Embarcadero donde esta esta función.
http://docwiki.embarcadero.com/Libra...onmentVariable

Además como se puede ver en la documentación de Microsoft esta API tiene 3 parámetros:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx.

Entonces porque cuando Embarcadero hizo la función le saco dos de esos parámetros.

Si alguien me puede decir como usar esa nueva función o si tengo que bajar alguna actualización para Delphi XE3 para corregir este error se los agradecería

El Rayo
Me da la impresión de que quieres usar la función "GetEnvironmentVariable" que Delphi implementa, y no la otra, "para la que no tienes argumentos". Lo que está pasando, seguramente, es que, por el orden en que incluyes las unidades, Delphi está queriendo usar la función de la unidad "Windows", y no la de la unidad "SysUtils". Para "forzar" el uso de la función que se encuentra en esta unidad, bastará que te refieras a ella siguiendo su "ruta completa", tal que así:

Código Delphi [-]
var
  appDataVar : string;
begin
  // Usamos la función indicando la unidad en que se encuentra
  appDataVar := System.SysUtils.GetEnvironmentVariable( APPDATA );

  // Ya puedes usar el valor de la variable "appDataVar".
end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 08-07-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Leyendo tu último mensaje coincido con dec sobre la causa de que no te funcione la implementación de Delphi.

Desconozco si será así para Delphi XE3 por que aún no he podido adquirir una nueva versión. Pero, por si te sirve de ayuda, te pongo un trozo de código donde llamo a la función GetEnvironmentVariable de ambos modos (desde Delphi 7):
Código Delphi [-]
var
  EnvStr: string;
  size: Integer;
begin
  // Mediante la función Delphi
  ShowMessage('Delphi: '+ SysUtils.GetEnvironmentVariable('WINDIR'));

  // Mediante la API de windows
  size := Windows.GetEnvironmentVariable('WINDIR',nil,0);
  if size > 0 then
  begin
    SetLength(EnvStr, size-1);
    Windows.GetEnvironmentVariable('WINDIR',PChar(EnvStr),size);
    ShowMessage('Win API: '+EnvStr);
  end;
end;

Cita:
Entonces porque cuando Embarcadero hizo la función le saco dos de esos parámetros.
No podría asegurar el motivo que llevó a los diseñadores de Delphi a hacerlo. Estimo que para simplificarles la llamada a los usuarios del lenguaje.

Y comparando la dificultad en el uso de una u otra, mas bién surge preguntar por que los diseñadores de Windows no la hicieron de otro modo...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 08-07-2013
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 291
Poder: 21
elrayo76 Va por buen camino
Gracias Dec, me has dado una pista de por donde empezar a buscar para ve en que unit esta cada una de las funciones, tanto la implementada por Delphi como la de la API de Windows.

Igualmente por todos los ejemplos que aparecen en Internet la que yo quiero usar es la de la API de Windows. Esta no esta indicada en la documentación del lenguaje en que unit se encuentra y por consiguiente yo puse la unit SysUtils que es donde se encuentra la otra.

Vere esto último en cuento este con la máquina donde lo quiero usar y les contare como me fue.

Saludos y muchas gracias a todos,
El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno
Responder Con Cita
  #10  
Antiguo 08-07-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
elrayo76,

Te comento:

Cita:
Empezado por elrayo76
...en Delphi XE3 esa función no tiene los mismos tres parámetros como se ve en el ejemplo de Lepe...
En el ejemplo del Msg #3 se usa la API GetEnvironmentVariable de Windows no la función de Delphi contenida en la unidad SysUtils.

Cita:
Empezado por elrayo76
...nlsgarcia, si te fijas en los enlaces que tu mandas en tu mensaje, lo que dice Microsoft de la API y lo que esta implementado por Embarcadero para el uso de esa API no coincide para nada en los parámetros...
Como te comente en el Msg #4 son funciones análogas pero con diferentes parámetros, el uso de una u otra (Windows o Delphi) depende del programador, en lenguajes en los que no se incluyan esta función se debe hacer uso del API de Windows.

Cita:
Empezado por elrayo76
...¿porque no existe código alguno en la Web con esta función y si con la que tiene los tres parámetros y que no existe en ninguna de las units de Delphi en ninguna de sus versiones desde la 7 en adelante. O es que todos usan la API y nadie dice de donde la llaman?...
Pregunto: ¿Te fue posible probar el código del Msg #4?, el código sugerido funciono correctamente en Delphi 7, Delphi 2006 y Delphi 2010 y hace uso de la función GetEnvironmentVariable que se encuentra en SysUtils.

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
   EnvWin : array[0..26] of string =
            ('ALLUSERSPROFILE', 'APPDATA', 'CLIENTNAME',
             'COMMONPROGRAMFILES', 'COMPUTERNAME', 'COMSPEC',
             'HOMEDRIVE', 'HOMEPATH', 'LOGONSERVER',
             'NUMBER_OF_PROCESSORS','OS', 'PATH',
             'PATHEXT', 'PROCESSOR_ARCHITECTURE', 'PROCESSOR_IDENTIFIER',
             'PROCESSOR_LEVEL', 'PROCESSOR_REVISION', 'PROGRAMFILES',
             'SESSIONNAME', 'SYSTEMDRIVE', 'SYSTEMROOT',
             'TEMP', 'TMP', 'USERDOMAIN',
             'USERNAME', 'USERPROFILE', 'WINDIR'
            );

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetWinEnvVar(WinEnvVar: String): String;
var
   ResultEnvVar: String;
   LenEnvVar: Integer;

begin

   LenEnvVar:= GetEnvironmentVariable(PChar(WinEnvVar),nil,0);

   if LenEnvVar > 0 then
   begin
      SetLength(ResultEnvVar,LenEnvVar);
      Windows.GetEnvironmentVariable(PChar(WinEnvVar),PChar(ResultEnvVar),LenEnvVar);
      Result:= ResultEnvVar;
   end
   else
      Result:= EmptyStr;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
   i : Integer;

begin

   ListBox1.Clear;
   for i:= Low(EnvWin) to High(EnvWin) do
   begin
      ListBox1.Items.Add(Format('%s = %s',[EnvWin[i],SysUtils.GetEnvironmentVariable(EnvWin[i])]));
   end;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
   i : Integer;

begin

   ListBox1.Clear;
   for i:= Low(EnvWin) to High(EnvWin) do
   begin
      ListBox1.Items.Add(Format('%s = %s',[EnvWin[i],GetWinEnvVar(EnvWin[i])]));
   end;

end;

end.
El código anterior es un ejemplo del uso de la función GetEnvironmentVariable (Unit Windows y SysUtils) haciendo la llamada explicita de esta en su unidad correspondiente (Aunque no es necesario en Delphi7, Delphi 2006 y Delphi 2010 donde funciono correctamente según lo esperado) para destacar su funcionalidad análoga y diferencia de parámetros. Para facilitar las pruebas, el ejemplo esta disponible en el siguiente link: http://terawiki.clubdelphi.com/Delph...ntVariable.rar

Cita:
Empezado por dec
...Lo que está pasando, seguramente, es que, por el orden en que incluyes las unidades, Delphi está queriendo usar la función de la unidad "Windows", y no la de la unidad "SysUtils"...
En las pruebas que hice en Delphi 7, Delphi 2006 y Delphi 2010 la unidad SysUtils estaba declarada después de la unidad Windows y esto no afecto el uso de la función GetEnvironmentVariable de Delphi, quizás en Delphi XE3 sea diferente.

Te sugiero leer nuevamente el Msg #4 y probar el código del enlace sugerido, quizás ayude a aclarar un poco el tema en cuestión.

Espero sea útil

Nelson.
Responder Con Cita
  #11  
Antiguo 09-07-2013
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 291
Poder: 21
elrayo76 Va por buen camino
He podido probar la función de las dos maneras, usando la de Delphi y la de la API. Funcionaron las dos para lo que necesito.

Ahora comento que hay que tener mucho cuidado cuando se incluye la unit SysUtils porque si se quiere usar la función de la API al incluir esa unit Delphi busca la que tiene la misma unit y no utiliza la de la API.. Igualmente esto se soluciona haciendo una llamada completa a la que corresponda coomo por ejemplo sysUtils.GetEnvironmentVariable.

Desde ya muchas gracias a todos por sus respuestas.

Saludos,
El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Función javascript que llama a otra función javascript en otra página jandroruiz HTML, Javascript y otros 4 28-02-2013 11:38:00
función POS petete2008 Varios 4 05-09-2012 16:30:27
Funcion fafita Varios 7 25-01-2008 16:03:40
Función Last Triton Firebird e Interbase 2 25-05-2005 17:46:50
La función Ord() soul6301 Varios 2 27-06-2004 01:43:17


La franja horaria es GMT +2. Ahora son las 05:48:31.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi