PDA

Ver la Versión Completa : Duda acerca de ShellExecute


Chupi
21-12-2004, 16:12:32
Hola me gustaria saber si podría poner un codigo para que se ejecute el ShellExecute para todos los usuarios, aver que me explico, un ejemplo:

ShellExecute ('C:\Documents and Settings\Administrador' ) ;

Donde Administrador puede estar el nombre de otro usuario y me pregunto si ay un comando para que funcione con todos, algo asi como ¨users¨, no se mejor dejo de decir burradas y me ayudais, GRACIAS.;)

PDT: eta es mi 1ª pregunta aqui ;)

defcon1_es
21-12-2004, 16:37:14
Hola,
¿pero qué fichero quieres ejecutar exactamente?

ShellExecute sirve para realizar acciones sobre ficheros,
¿qué es lo que quieres hacer?

PD: Ayuda de MS sobre ShellExecute
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp

Chupi
21-12-2004, 18:46:25
quiero crear un boton que me lleve a un directorio que se encuentra en documents & settings, cosa que ya consegui. Lo que pasa que solo me funciona a mi por lo siguiente:

"El boton que cree en la aplicacion me lleva al siguiente directorio..."

C:\Documents and Settings\Chupi\Configuración local\Archivos temporales de Internet

"...y a unas cuantas personas les gusto mi aplicacion porque son unos gandules."

Entonces yo no boy a estar creando aplicaciones para cada uno de los usuarios que me la pidan. Así es como lo puse y funciona, pero solo para mí:

ShellExecute ( 'C:\Documents and Settings\Chupi\Configuración local\Archivos temporales de Internet' )

El problema esta en "Chupi", no todo el mundo tiene este directorio claro.

GRACIAS por atenderme.

maeyanes
21-12-2004, 19:59:57
Usa la variable del sistema %HOMEPATH% para averiguar el dato que necesitas.

Puedes usar esta función:


function GetEnvVarValue(const VarName: string): string;
var
BufSize: Integer; // buffer size required for value
begin
// Get required buffer size (inc. terminal #0)
BufSize := GetEnvironmentVariable(PChar(VarName), nil, 0);
if BufSize > 0 then
begin
// Read env var value into result string
SetLength(Result, BufSize - 1);
GetEnvironmentVariable(PChar(VarName), PChar(Result), BufSize)
end
else
// No such environment variable
Result := '';
end;


%HOMEPATH% contiene el valor: C:\Documents and Settings\UserName, ya solo le tienes que agregar el resto de la ruta deseada.


Saludos...

roman
21-12-2004, 22:31:54
Otra forma es usar la siguiente función:


uses
ShlObj;

function GetSpecialFolder(nFolder: Integer): String;
var
Path: array[0..MAX_PATH] of Char;

begin
ShlObj.SHGetSpecialFolderPath(0, Path, nFolder, false);
Result := Path;
end;


que te da la ruta de muchos folders de este tipo. En tu caso usarías:


Edit1.Text := GetSpecialFolder(CSIDL_INTERNET_CACHE);


Si consultas la ayuda del SDK de Windows para la función ShGetSpecialFolderLocation podrás ver los valores que puedes dar al parámetro nFolder.

// Saludos

Chupi
22-12-2004, 14:36:42
Ok, gracias creo que ya me quedo claro, aver si me compro el dichoso libro porque si no boy a estar con dudas hasta que me canse.

Chupi
22-12-2004, 15:01:30
Pues parece que no funciona, le puse el siguiente codigo y nada:

procedure TForm1.Button1Click(Sender: TObject);
function GetSpecialFolder(nFolder: Integer): String;
var
Path: array[0..MAX_PATH] of Char;
begin
ShlObj.SHGetSpecialFolderPath(0, Path, nFolder, false);
Result := Path;
end;
End;
end.

Me da los siguientes errores:

[Error] Unit1.pas(39): BEGIN expected but END found
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

roman
22-12-2004, 16:33:07
No pongas el cuerpo de la función dentro del procedimiento. La función está para que puedas usarla desde cualquier parte. Suponiendo que vas a colocar la ruta en un edit al moment de hacer click al botón, pondrías:


procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := GetSpecialFolder(CSIDL_INTERNET_CACHE);
end;


pero la definición de la función la dejas fuera.

// Saludos

pd: ¿A qué libro te refieres? Ten encuenta que ningún libro bastará y tienes que recurrir a varias fuentes. Para cuestiones relacionadas con las APIs de Windows, una fuente invaluable es la ayuda del SDK de Windows que se incluye con Delphi o que puedes consultar más actualizada y completa
directamente en línea en http://msdn.microsoft.com/library/

Chupi
22-12-2004, 16:44:46
Ok pero sigo teniendo problemas de tozudo porque no tengo ni idea y puse lo siguiente:

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShlObj, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function GetSpecialFolder(nFolder: Integer): String;
procedure TForm1.Button1Click(Sender: TObject);
var
Path: array[0..MAX_PATH] of Char;
begin
ShlObj.SHGetSpecialFolderPath(0, Path, nFolder, false);
Result := Path;
end;
End;
end.

Y los errores:

[Error] Unit1.pas(27): ';' expected but '.' found
[Error] Unit1.pas(12): Unsatisfied forward or external declaration: 'TForm1.Button1Click'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

Seguro que la respuesta esta ante mis narizes lo que pasa que todavia no entiendo muy bien los codigos, solo me se los basicos.

Y acerca de lo del libro es mas bien un manual de como usar el delphi.

PD: Gracias por aguantarme.

maeyanes
22-12-2004, 16:50:50
Sigues poniendo mal tú código...

Debes hacerlo así más o menos...



// Inicio de unidad y Declaraciones...

function GetSpecialFolder(nFolder: Integer): String;
var
Path: array[0..MAX_PATH] of Char;

begin
ShlObj.SHGetSpecialFolderPath(0, Path, nFolder, false);
Result := Path;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := GetSpecialFolder(CSIDL_INTERNET_CACHE);
end;

Chupi
22-12-2004, 18:46:32
no quiero nada de un texto, tan solo es una variable que no se donde ponerla pero si se que la del win2K es USERPROFILE% y la del XP es %HOMEPATCH% y yo me toy aciendo un lio.

PD: vamos a batir un record en mensajitos colega.

maeyanes
22-12-2004, 19:08:23
Retomando lo que deseas hacer en realidad, este sería el código que tienes que utilizar en el evento OnClick del botón.


procedure TForm1.Button1Click(Sender: TObject);
var
Path: string;

begin
Path := GetSpecialFolder(CSIDL_INTERNET_CACHE);
// Path tendría algo como: 'C:\Documents and Settings\Chupi\Configuración
// local\Archivos temporales de Internet'
ShellExecute (Path)
end;

Chupi
23-12-2004, 15:55:40
¿me podriais mandar la funcion completa? y me quito un gran problema de la cabeza, (así de paso me lo estudio), os lo agradecería bastante.

;) Gracias y SALUDOS.