Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-01-2014
sonjeux sonjeux is offline
Miembro
 
Registrado: jul 2004
Posts: 60
Poder: 14
sonjeux Va por buen camino
Unhappy Delphi XE2, Windows 7, fileexists y shellexecute no funcionan

Saludos, estoy programando en Delphi XE2, en Windows 7 64Bits, y no me funcionan ninguno de los 2 comandos fileexists y shellexecute. Probe de varias formas. El codigo que estoy usando es uno que vi aqui y no me funciono tampoco, me sale el mensaje file not found pero si existe lo comprobe manualmente, si alguien me podria decir por que no funciona, gracias.

Código Delphi [-]
var Archivo: string;
    errorcode: integer;
begin
    Archivo:=cxTextEdit6.Text;
   errorcode :=
   ShellExecute(0, 'open', pchar(Archivo), nil, nil, SW_NORMAL);
   case errorcode of
      2:showmessage('file not found');
      3:showmessage('path not found');
      5:showmessage('access denied');
      8:showmessage('not enough memory');
      32:showmessage('dynamic-link library not found');
      26:showmessage('sharing violation');
      27:showmessage('filename association incomplete or invalid');
      28:showmessage('DDE request timed out');
      29:showmessage('DDE transaction failed');
      30:showmessage('DDE busy');
      31:showmessage('no application associated with the given filename extension');
   end;

   //ShellExecute(0, nil, pchar(Archivo), '', '', SW_SHOWNORMAL);
end;
Responder Con Cita
  #2  
Antiguo 14-01-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.736
Poder: 27
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 behold
Hola sonjeux.

Lamento no tener otra versión, pero te adjunto un código que funciona correctamente con Delphi 7 en Windows 64bits, estimo que debería hacerlo del mismo modo en Delphi XE2. Para probarlo, crea una carpeta temporal y descomprimilo allí. (El demo incluye un archivo .txt en la misma carpeta)

Algo importante a tomar en cuenta es que en Windows 64bits la carpeta Windows\System32 es redirigida a Windows\SysWOW64, así que el código:
Código Delphi [-]
 procedure TForm1.btnSystem32Click(Sender: TObject);
begin
  if FileExists('C:\Windows\System32\telnet.exe') then
    ShowMessage('Existe')
  else
    ShowMessage('No existe')
end;
nos va a porfiar con un rotundo "No existe" aunque tengamos seleccionado el archivo desde el explorador de windows y precisamente en esa carpeta ...

La solución mas simple es reemplazar "System32" por el alias "Sysnative" que le indica al sistema de archivos que no debe redirigir el acceso:
Código Delphi [-]
procedure TForm1.btnSysnativeClick(Sender: TObject);
begin
  if FileExists('C:\Windows\Sysnative\telnet.exe') then
    ShowMessage('Existe')
  else
    ShowMessage('No existe')
end;

Saludos
Archivos Adjuntos
Tipo de Archivo: zip sonjeux.zip (4,3 KB, 5 visitas)
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 14-01-2014
Avatar de Neftali
Neftali Neftali is offline
-Germán Estévez-
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 15.255
Poder: 10
Neftali Va camino a la famaNeftali Va camino a la fama
A veces es problema de que el nombre incluye espacios.
Haz una sencilla prueba de acceder a un nombre de fichero sencillo (sin espacios y con pocos caracteres).
Por ejemplo: c:\hola.txt

Descartarás de esa forma que sea por ese problema.

La otra opción más común es que sea por tema de permisos.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 14-01-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.736
Poder: 27
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 behold
Hola sonjeux.

Ampliando el caso de FileExists, se puede encapsular la detección del SO en una función para que trabaje en Win32 y Win64:
Código Delphi [-]
function FileExistsExt(aFileName: TFileName): Boolean;
type
 LPFN_ISWOW64PROCESS = function(hProcess: THandle; var Wow64Proc: BOOL): BOOL; stdcall;
var
  fnIsWow64Proc: LPFN_ISWOW64PROCESS;
  IsWow64: BOOL;
begin
  fnIsWow64Proc:= LPFN_ISWOW64PROCESS(GetProcAddress(GetModuleHandle('kernel32'), 'IsWow64Process'));
  if Assigned(fnIsWow64Proc) then
    fnIsWow64Proc(GetCurrentProcess(), IsWow64);
  if IsWow64 then
    Result:= FileExists(StringReplace(aFileName, 'System32', 'Sysnative', [rfIgnoreCase]))
  else
    Result:= FileExists(aFileName);
end;

Saludos
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 14-01-2014 a las 12:57:18.
Responder Con Cita
  #5  
Antiguo 14-01-2014
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 706
Poder: 15
cloayza Va camino a la fama
Intenta con este pequeño cambio...

Código Delphi [-]
var Archivo: string;
    errorcode: integer;
begin
    Archivo:=cxTextEdit6.Text;

    If Not FileExists(Archivo) Then Exit;

   errorcode :=
   ShellExecute(0, 'open', PWideChar(Archivo), nil, nil, SW_NORMAL);
   case errorcode of
      2:showmessage('file not found');
      3:showmessage('path not found');
      5:showmessage('access denied');
      8:showmessage('not enough memory');
      32:showmessage('dynamic-link library not found');
      26:showmessage('sharing violation');
      27:showmessage('filename association incomplete or invalid');
      28:showmessage('DDE request timed out');
      29:showmessage('DDE transaction failed');
      30:showmessage('DDE busy');
      31:showmessage('no application associated with the given filename extension');
   end;

   //ShellExecute(0, nil, pchar(Archivo), '', '', SW_SHOWNORMAL);
end;
Saludos
Responder Con Cita
  #6  
Antiguo 14-01-2014
sonjeux sonjeux is offline
Miembro
 
Registrado: jul 2004
Posts: 60
Poder: 14
sonjeux Va por buen camino
cloayza gracias por responder te comento que no funciona con PWideChar,

ecfisa gracias por responder, te comento que no me funciona en delphi XE2, en delphi 7 me funciona, Neftali te comento que probe con una direccion similar a c:\hola.txt y no me funciono, lei que varias personas tienen ese problema en las versiones de XE en el foro de embarcadero, probe ejecutar el programa que hize como administrador y tampoco funciono, pero tal vez mi windows 7 este mal, me interesa solucionar el problema que tengo con shellexecute ya que el programa que hice tiene un campo donde se adjunta la direccion de un archivo, word, txt o imagen, y quisiera otro boton para ver ese archivo, gracias a todos por su ayuda.

Alguien puede probar si le funciona shellexecute en un delphi XE, gracias.
Responder Con Cita
  #7  
Antiguo 14-01-2014
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 706
Poder: 15
cloayza Va camino a la fama
La modificación que te envié la prove en XE2 y si funciona...(Win7 x64).

Este es el código que probe....
Código Delphi [-]
var Archivo: string;
    errorcode: integer;
begin
     Archivo:='c:\Windows\SysWOW64\calc.exe';

     //Archivo:='c:\Windows\System32\calc.exe';

    If Not FileExists(Archivo) Then Exit;

    Errorcode:=ShellExecute(0, 'open', PWideChar(Archivo), nil, nil, SW_NORMAL);
end;

Verifica la ruta y nombre del comando a ejecutar...
Puede ser otro el problema...
Responder Con Cita
  #8  
Antiguo 14-01-2014
sonjeux sonjeux is offline
Miembro
 
Registrado: jul 2004
Posts: 60
Poder: 14
sonjeux Va por buen camino
Question

Cita:
Empezado por cloayza Ver Mensaje
La modificación que te envié la prove en XE2 y si funciona...(Win7 x64).

Este es el código que probe....
Código Delphi [-]
var Archivo: string;
    errorcode: integer;
begin
     Archivo:='c:\Windows\SysWOW64\calc.exe';

     //Archivo:='c:\Windows\System32\calc.exe';

    If Not FileExists(Archivo) Then Exit;

    Errorcode:=ShellExecute(0, 'open', PWideChar(Archivo), nil, nil, SW_NORMAL);
end;

Verifica la ruta y nombre del comando a ejecutar...
Puede ser otro el problema...
Gracias si lo probe y funciona, ahora no se por que si quiero abrir desde la direccion que esta en un edti1.text no quiere abrirlo, sera por que text devuelve una variable de tipo tcaption? :P, el codigo que uso es el siguiente

Para seleccionar el archivo

Código Delphi [-]
procedure TConsulta.cxButton3Click(Sender: TObject);
begin
    if OpenDialog1.Execute then
         Edit1.Text:=OpenDialog1.Files.Text;
end;

Para ejecutar el archivo

Código Delphi [-]
procedure TConsulta.cxButton6Click(Sender: TObject);
var Archivo: string;
    errorcode: integer;
begin
    ShowMessage(Archivo);
    If Not FileExists(Edit1.Text) Then Exit;

    Errorcode:=ShellExecute(handle, 'open', PWideChar(Edit1.Text), nil, nil, SW_SHOWNORMAL);   
end;

Como vez es el mismo codigo

Si coloco la direccion asi

Código Delphi [-]
Archivo:='c:\Windows\SysWOW64\calc.exe';
Archivo:='C:\Compartida\Villanueva Agosto 2013\esvillanueva\facturasvillanueva.txt';

Funciona en los dos casos, pero si coloco asi

Código Delphi [-]
Archivo:=edit1.text;

ya no funciona , muchas gracias por tu tiempo.
Responder Con Cita
  #9  
Antiguo 14-01-2014
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 706
Poder: 15
cloayza Va camino a la fama
Creo que el problema está aquí...

Código Delphi [-]
procedure TConsulta.cxButton3Click(Sender: TObject);
begin
    if OpenDialog1.Execute then
         //Edit1.Text:=OpenDialog1.Files.Text;
         Edit1.Text:=OpenDialog1.Filename;
end;

Prueba realizando este pequeño cambio
Responder Con Cita
  #10  
Antiguo 14-01-2014
sonjeux sonjeux is offline
Miembro
 
Registrado: jul 2004
Posts: 60
Poder: 14
sonjeux Va por buen camino
Thumbs up

Cita:
Empezado por cloayza Ver Mensaje
Creo que el problema está aquí...

Código Delphi [-]
procedure TConsulta.cxButton3Click(Sender: TObject);
begin
    if OpenDialog1.Execute then
         //Edit1.Text:=OpenDialog1.Files.Text;
         Edit1.Text:=OpenDialog1.Filename;
end;

Prueba realizando este pequeño cambio
Muchas gracias, si funciona ahora a leer sobre eso, jajaja, muchas gracias por su ayuda.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Fallo copyfile y fileexists en servicio windows y red Ivanzinho Varios 4 13-08-2013 09:50:59
FileExists() no lee .dll en system32 to_to API de Windows 21 29-05-2013 23:15:11
No me funcionan las teclas de acceso rapido de Delphi Atelio Varios 3 10-05-2013 15:18:13
No me funcionan los recurso para poner delphi en español Durbed Varios 28 20-10-2006 18:14:11
Fileexists sobre una red Kipow Varios 2 26-05-2006 14:57:43


La franja horaria es GMT +2. Ahora son las 13:44:51.


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