Page 1 of 1

winexec ó ShellExecute

PostPosted: 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 view

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

PostPosted: 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

PostPosted: 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?
Code: Select all  Expand view

ShellExecute() o ShellExecuteEx()
 

Re: winexec ó ShellExecute

PostPosted: 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

PostPosted: Wed Dec 13, 2023 1:06 pm
by karinha
Ejemplo con WaitRunEx() y ShellExecuteEx() ??

Gracias.

Regards, saludos.

Re: winexec ó ShellExecute

PostPosted: 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

PostPosted: Wed Dec 13, 2023 3:29 pm
by karinha
Esto esta correcto?

Code: Select all  Expand view

// 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

PostPosted: 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

PostPosted: 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