FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour winexec ó ShellExecute
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
winexec ó ShellExecute
Posted: Wed Dec 13, 2023 11:53 AM
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 (fw): Select all Collapse
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
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: winexec ó ShellExecute
Posted: Wed Dec 13, 2023 11:58 AM
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
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: winexec ó ShellExecute
Posted: Wed Dec 13, 2023 12:05 PM
Antonio muchas gracias por la pronta respuesta.

Ahora surge otra duda, cual es la diferencia entre las dos funciones que sugieres?
Code (fw): Select all Collapse
ShellExecute() o ShellExecuteEx()
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: winexec ó ShellExecute
Posted: Wed Dec 13, 2023 12:21 PM

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.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: winexec ó ShellExecute
Posted: Wed Dec 13, 2023 01:06 PM

Ejemplo con WaitRunEx() y ShellExecuteEx() ??

Gracias.

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 563
Joined: Sun Oct 09, 2005 07:23 PM
Re: winexec ó ShellExecute
Posted: Wed Dec 13, 2023 02:52 PM

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.

Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: winexec ó ShellExecute
Posted: Wed Dec 13, 2023 03:29 PM
Esto esta correcto?
Code (fw): Select all Collapse
// 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.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: winexec ó ShellExecute
Posted: Wed Dec 13, 2023 06:34 PM
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
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1772
Joined: Thu Sep 05, 2019 05:32 AM
Re: winexec ó ShellExecute
Posted: Thu Dec 14, 2023 04:59 AM

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

greeting,

Jimmy

Continue the discussion