Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   problema con el ShellExecute (https://www.clubdelphi.com/foros/showthread.php?t=45624)

nogoncar 09-07-2007 21:33:00

problema con el ShellExecute
 
Hola,

necesito que alguien me heche una mano con un problemilla que tengo.

Hice una aplicación y tengo creado un boton de ayuda. Lo que quiero es que al pulsar en él pueda visualizar un pdf de ayuda (un manual).

Este es el código que tengo escrito, pero al pulsar en el icono de ayuda simplemente no hace nada, ni da ningún tipo de error....

void __fastcall TForm1::IconoAyudaClick(TObject *Sender)
{
ShellExecute(GetActiveWindow(), "open", "E:\proxecto\ULTIMO\ayuda\ayuda.pdf" , NULL, NULL, SW_SHOWNORMAL);
}

¿alguien tiene idea de porque, o sabe alguna otra manera que pueda funcionar?

gracias

dec 09-07-2007 21:36:19

Hola,

Primero que nada (aunque parezca simple) comprueba que existe el archivo en cuestión. Por otro lado comprueba el resultado de la función "ShellExecute", y llegado el caso comprueba también el último error con la función "GetLastError()".

Código Delphi [-]

if ShellExecute({parámetros}) <= 32 then
begin
  ShowMessage( SysErrorMessage( GetLastError() ) );
end;

Edito: Tal vez me pasé de listo. Mirando la ayuda no veo referencia a que pueda usarse "GetLastError()"... y sí a que la función puede retornar un entero menor o igual que 32 en caso de éxito, o uno de los siguientes enteros/constantes en caso de error:

Código:

0 The operating system is out of memory or resources.
ERROR_FILE_NOT_FOUND The specified file was not found.
ERROR_PATH_NOT_FOUND The specified path was not found.
ERROR_BAD_FORMAT The .exe file is invalid (non-Microsoft Win32 .exe or error in .exe image).
SE_ERR_ACCESSDENIED The operating system denied access to the specified file.
SE_ERR_ASSOCINCOMPLETE The file name association is incomplete or invalid.
SE_ERR_DDEBUSY The Dynamic Data Exchange (DDE) transaction could not be completed because other DDE transactions were being processed.
SE_ERR_DDEFAIL The DDE transaction failed.
SE_ERR_DDETIMEOUT The DDE transaction could not be completed because the request timed out.
SE_ERR_DLLNOTFOUND The specified DLL was not found.
SE_ERR_FNF The specified file was not found.
SE_ERR_NOASSOC There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable.
SE_ERR_OOM There was not enough memory to complete the operation.
SE_ERR_PNF The specified path was not found.
SE_ERR_SHARE A sharing violation occurred.


nogoncar 09-07-2007 21:54:18

Gracias por la ayuda, ya he solucionado el problema gracias a la función que me pasaste para ver el último error.

No encontraba el archivo especificado!

Lo raro es que era porque ponía una barra para los directorios en vez de 2, así funciona:

"E:\\proxecto\\ULTIMO\\ayuda\\ayuda.pdf"

no tenía ni idea de que tenía que indicar así los subdirectorios!!!

Gracias de nuevo

dec 09-07-2007 22:43:21

Hola,

Pues es verdad... yo no había caído tampoco. :)

cocomo 10-07-2007 09:11:03

Buenas, la verdad es que yo utilizo el siguiente procedimiento:

Código Delphi [-]
procedure ImprimirDoc(NombreDoc : string);
begin
  if ShellExecute(0, 'print', PChar(NombreDoc), nil, nil, SW_HIDE) <= 32 then
  begin
    ShowMessage('Fallo Acrobat');
  end;
end;

y la cadena que le paso como argumento no tiene porque llevar doble contrabarra, es decir yo llamo al procedimiento tal que asi:

Código Delphi [-]
ImprimirDoc('C:\CERTIFICADOS\AM_11-135.pdf');

En mi caso le digo que lo imprima directamente sin mostrarlo por pantalla, pero vamos pienso yo que será lo mismo print que open.
De todas formas yo uso windows 2000 server y delphi 6 por si puede influir en algo.

dec 10-07-2007 10:42:44

Cita:

Empezado por cocomo
y la cadena que le paso como argumento no tiene porque llevar doble contrabarra (...)

Se trata de C++. En este lenguaje (como en C y algún otro derivado) es precisa la "contrabarra", puesto que esta es un caracter de escape, de modo que hay que indicar expresamente (con una doble barra) que lo que se quiere realmente es una barra... no sé si me explico. :D :D


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

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