Page 1 of 1
winexec ó ShellExecute
Posted: Wed Dec 13, 2023 11:53 am
by leandro
Hola buenos días para todos, en este momento nos surge la necesidad de reiniciar la aplicación de manera automática luego que se produzca en error, pero queremos saber cual es la mejor opción para hacerlo, leyendo un poco en el foro encontramos las funciones winexec y ShellExecute, pero queremos saber cual es la diferencia entre ambas funciones, y si se tiene alguna
limitación al usarlas.
Al inicio de la aplicación definimos la función
Code: Select all | Expand
SetPostErrorAction( { |cErrorLogFileName, oError| fErrorAction( cErrorLogFileName, oError ) } )
function fErrorAction(cErrorLogFileName, oError )
Local cExec := "c:\dlyma\dlyma.exe"
ShellExecute( 0, "Open", cExec, , 0, 1 ) //Es mejor asi?
winexec( cExec ) //o así?
return nil
Cual es la mejor forma de hacerlo?
De antemano gracias
Re: winexec ó ShellExecute
Posted: Wed Dec 13, 2023 11:58 am
by Antonio Linares
ShellExecute() es más efectivo que WinExec() para iniciar aplicaciones en Windows. WinExec() es una función obsoleta que solo se proporciona por compatibilidad con Windows 16 bits. ShellExecute() permite especificar un verbo que indica la operación a realizar sobre un objeto de archivo o carpeta, como abrir, editar, imprimir, etc. Además, ShellExecute() puede iniciar aplicaciones asociadas a archivos que no son ejecutables, mientras que WinExec() solo puede iniciar archivos ejecutables. Por lo tanto, se recomienda usar ShellExecute() o ShellExecuteEx() en lugar de WinExec() para programar para Windows
Re: winexec ó ShellExecute
Posted: Wed Dec 13, 2023 12:05 pm
by leandro
Antonio muchas gracias por la pronta respuesta.
Ahora surge otra duda, cual es la diferencia entre las dos funciones que sugieres?
Re: winexec ó ShellExecute
Posted: Wed Dec 13, 2023 12:21 pm
by Antonio Linares
ShellExecute() y ShellExecuteEx() son dos funciones que se pueden usar para realizar una operación en un archivo especificado, como abrirlo, editarlo, imprimirlo, etc. La diferencia entre ellas es que ShellExecuteEx() es una versión más personalizada y avanzada de ShellExecute(), que ofrece más opciones y control sobre la ejecución. Algunas de las ventajas de usar ShellExecuteEx() son:
Puede especificar un identificador de ventana que se usará como propietario de cualquier interfaz de usuario o mensaje de error que se muestre durante la ejecución.
Puede especificar un verbo que indique la acción que se va a realizar, como “runas” para ejecutar una aplicación como administrador.
Puede obtener información sobre la aplicación que se inicia como resultado de la llamada, como el identificador de instancia, el código de
salida y el identificador del proceso.
Puede proporcionar una estructura SHELLEXECUTEINFO que contenga información adicional sobre la ejecución, como el directorio de trabajo, los parámetros, el modo de mostrar la ventana, el título de la ventana, el icono, el teclado y el identificador de clase de la aplicación.
Puede esperar a que la aplicación se cierre antes de continuar con la ejecución de su propia aplicación, estableciendo el miembro fMask de la estructura SHELLEXECUTEINFO en SEE_MASK_NOCLOSEPROCESS y usando la función WaitForSingleObject con el miembro hProcess.
Re: winexec ó ShellExecute
Posted: Wed Dec 13, 2023 1:06 pm
by karinha
Ejemplo con WaitRunEx() y ShellExecuteEx() ??
Gracias.
Regards, saludos.
Re: winexec ó ShellExecute
Posted: Wed Dec 13, 2023 2:52 pm
by Verhoven
Buenas tardes Antonio, vista tu respuesta me queda la duda de si la has redactado tu mismo o si es una respuesta de algún chatgpt.
Es solo una curiosidad.
Re: winexec ó ShellExecute
Posted: Wed Dec 13, 2023 3:29 pm
by karinha
Esto esta correcto?
Code: Select all | Expand
// C:\FWH\SAMPLES\EXEC2.PRG
#include "FiveWin.ch"
FUNCTION Main( cExec, cFile, lForce ) // .T.
LOCAL cStdOut, cStdErr
IF cExec = NIL .AND. cFile = Nil
MsgStop( "I need a valid FILE/EXE name" )
QUIT
ENDIF
IF cFile = Nil
IF File( cExec )
WinExec( cExec )
ELSE
ShellExecute( 0, "open", cExec, cFile, , 1 )
ENDIF
ELSE
IF ( "www" $ cFile )
ShellExecuteEx( cExec, cFile )
ELSE
IF File( cFile )
IF lForce = Nil
WinExec( cFile )
ELSE
ShellExecute( 0, "open", cExec, cFile, , 1 )
ENDIF
ELSE
ShellExecute( 0, "open", cExec, cFile, , 1 )
ENDIF
ENDIF
ENDIF
RETURN NIL
#pragma BEGINDUMP
#include <conio.h>
#include <windows.h>
#include <winbase.h>
#include <hbapi.h>
HB_FUNC( SHELLEXECUTEEX )
{
SHELLEXECUTEINFO sei;
sei.cbSize = sizeof(sei);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpVerb = "open";
sei.lpFile = hb_parc(2);
sei.nShow = SW_SHOW;
if (ShellExecuteEx(&sei))
{
WaitForSingleObject(sei.hProcess,INFINITE);
hb_retl(TRUE);
}
else
{
sei.lpFile = hb_parc(1);
sei.lpParameters = hb_parc(2);
if (ShellExecuteEx (&sei))
{
WaitForSingleObject(sei.hProcess,INFINITE);
hb_retl(TRUE);
}
}
}
#pragma ENDDUMP
// FIN / END
Regards, saludos.
Re: winexec ó ShellExecute
Posted: Wed Dec 13, 2023 6:34 pm
by Antonio Linares
Verhoven wrote:Buenas tardes Antonio, vista tu respuesta me queda la duda de si la has redactado tu mismo o si es una respuesta de algún chatgpt.
Es solo una curiosidad.
Es obvio
Lo hago a propósito para que nos acostumbremos a usar las nuevas herramientas
Re: winexec ó ShellExecute
Posted: Thu Dec 14, 2023 4:59 am
by Jimmy
hi,
when DblClick in Explorer on a *.BMP it will open *.BMP with associate App like Paint
Winexec() "just" call "special" EXE while ShellExecute() is use with associate File