Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Función GetEnvironmentVariable (https://www.clubdelphi.com/foros/showthread.php?t=83621)

elrayo76 08-07-2013 06:23:40

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

Casimiro Noteví 08-07-2013 10:06:44

No entiendo lo que dices, y en el enlace que has puesto dicen que funciona perfectamente :confused:
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.

Lepe 08-07-2013 10:49:56

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

nlsgarcia 08-07-2013 11:35:32

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.

ecfisa 08-07-2013 13:05:15

Cita:

Empezado por elrayo76 (Mensaje 463375)
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. :)

elrayo76 08-07-2013 15:03:03

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

dec 08-07-2013 15:12:47

Cita:

Empezado por elrayo76 (Mensaje 463394)
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;

ecfisa 08-07-2013 16:01:35

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... :rolleyes:

Saludos. :)

elrayo76 08-07-2013 16:02:32

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

nlsgarcia 08-07-2013 20:16:37

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.

elrayo76 09-07-2013 22:57:16

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


La franja horaria es GMT +2. Ahora son las 19:08:39.

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