winexec ó ShellExecute

winexec ó ShellExecute

Postby leandro » 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: Select all  Expand view  RUN

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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: winexec ó ShellExecute

Postby Antonio Linares » 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
User avatar
Antonio Linares
Site Admin
 
Posts: 42117
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: winexec ó ShellExecute

Postby leandro » 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: Select all  Expand view  RUN

ShellExecute() o ShellExecuteEx()
 
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: winexec ó ShellExecute

Postby Antonio Linares » 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
User avatar
Antonio Linares
Site Admin
 
Posts: 42117
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: winexec ó ShellExecute

Postby karinha » Wed Dec 13, 2023 1:06 pm

Ejemplo con WaitRunEx() y ShellExecuteEx() ??

Gracias.

Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7831
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: winexec ó ShellExecute

Postby Verhoven » Wed Dec 13, 2023 2: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.
Verhoven
 
Posts: 521
Joined: Sun Oct 09, 2005 7:23 pm

Re: winexec ó ShellExecute

Postby karinha » Wed Dec 13, 2023 3:29 pm

Esto esta correcto?

Code: Select all  Expand view  RUN

// 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
User avatar
karinha
 
Posts: 7831
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: winexec ó ShellExecute

Postby Antonio Linares » Wed Dec 13, 2023 6: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42117
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: winexec ó ShellExecute

Postby Jimmy » Thu Dec 14, 2023 4: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
User avatar
Jimmy
 
Posts: 1732
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 78 guests