De MSDN. Si estas pasando parametros fijate que lo pega sin agregarle el 
espacio de separacion. Es como el bug de Replace cuando estas en EOF(). Ya paso 
a ser una caracteristica de diseño :->

Saludos

Pablo Pioli
  ----- Original Message ----- 
  From: PabloC 
  To: GUFA List Member 
  Sent: Monday, December 10, 2007 5:11 PM
  Subject: [GUFA] ShellExecute


  Lo probe
  Me devuelve un error #267
  Solo tenes documentados el 2,3 y 87
  De donde puedo sacar info de los errores??

  Saludos
  PabloC
    ----- Original Message ----- 
    From: Pablo Pioli 
    To: GUFA List Member 
    Sent: Monday, December 10, 2007 4:58 PM
    Subject: [GUFA] ShellExecute


    Esta es la funcion que yo uso, podes evitar el loop inifinito un algunas 
modificaciones.

    ***
    * Function ShellWait
    *    Ejecuta un proceso y espera a que finalice
    ***
    Function ShellWait(cEXEFile, cCommandLine, nWindow)
    Local cStartupInfo, cProcInfo, nProcess


    * defines
    #define STARTF_USESHOWWINDOW    1

    #define m0                    256
    #define m1                  65536
    #define m2               16777216


    * Validaciones
    If Type("nWindow") <> "N"
       nWindow = SW_SHOWMAXIMIZED
    Endif


    * Declare WinAPI Functions
    Declare Short CreateProcess in WIN32API ;
                  String lpszModuleName, ;
                  String @lpszCommandLine, ;
                  String lpSecurityAttributesProcess, ;
                  String lpSecurityAttributesThread, ;
                  Short bInheritHandles, ;
                  Integer dwCreateFlags, ;
                  String lpvEnvironment, ;
                  String lpszStartupDir, ;
                  String @lpStartInfo, ;
                  String @lpProcessInfo

    Declare Integer WaitForSingleObject in kernel32 ;
            Integer hHandle,; 
            Integer dwMilliseconds 

    Declare Integer CloseHandle in kernel32 ;
            Integer hObject 

    Declare Integer GetLastError in kernel32


    * Incializar estructuras
    cStartupInfo = num2dword(68) + ;
                   num2dword(0) + num2dword(0) + num2dword(0) + ; 
                   num2dword(0) + num2dword(0) + num2dword(0) + num2dword(0) + 
; 
                   num2dword(0) + num2dword(0) + num2dword(0) + ; 
                   num2dword(STARTF_USESHOWWINDOW) + ; 
                   num2word(nWindow) + ;
                   num2word(0) + num2dword(0) + ;
                   num2dword(0) + num2dword(0) + num2dword(0) 

    cProcInfo = Replicate(Chr(0), 16) 


    * Ejecutar comando
    If !Empty(cCommandLine)
       cEXEFile = cEXEFile + cCommandLine
    Endif

    If CreateProcess(0, cEXEFile, 0, 0, 0, 0, 0, JustPath(cEXEFile), 
@cStartupInfo, @cProcInfo) == 0

       * Posibles errores
       *  2 = The system cannot find the file specified 
       *  3 = The system cannot find the path specified 
       * 87 = ERROR_INVALID_PARAMETER 
       MessageBox("Error número: " + LTrim(Str(GetLastError())), 64, "Error")

    else
       * Esperar a que termine
       nProcess = buf2dword(SUBSTR(cProcInfo, 1, 4)) 
       WaitForSingleObject(nProcess, -1)
       CloseHandle(nProcess)
    Endif

    EndFunc



    ***
    * Function num2dword
    *    Funcion auxiliar a ShellWait
    ***
    Function num2dword(nValue) 
    Local b0, b1, b2, b3 

    b3 = Int(nValue/m2) 
    b2 = Int((nValue - b3 * m2)/m1) 
    b1 = Int((nValue - b3*m2 - b2*m1)/m0) 
    b0 = Mod(nValue, m0) 

    Return(Chr(b0) + Chr(b1) + Chr(b2) + Chr(b3))



    ***
    * Function num2word
    *    Funcion auxiliar a ShellWait
    ***
    Function num2word(nValue) 
    Return(Chr(Mod(nValue, 256)) + Chr(Int(nValue / 256)))



    ***
    * Function buf2dword
    *    Funcion auxiliar a ShellWait
    ***
    Function buf2dword(cBuffer) 
    Return(Asc(SubStr(cBuffer, 1, 1)) + ; 
           Asc(SubStr(cBuffer, 2, 1)) * 256 + ; 
           Asc(SubStr(cBuffer, 3, 1)) * 65536 + ; 
           Asc(SubStr(cBuffer, 4, 1)) * 16777216)

      ----- Original Message ----- 
      From: PabloC 
      To: GUFA List Member 
      Sent: Monday, December 10, 2007 1:34 PM
      Subject: [GUFA] ShellExecute


      Gracias Jose
      Puedo tener control sobre el proceso externo, pero no queria llegar a 
eso, x que puede ser un loop infinito si ese archivo por algun motivo no se 
creo y deberia tambien controlar eso.
      Pensaba en algo mas eficiente

      Saludos
      PabloC
        ----- Original Message ----- 
        From: Jose Cardaropoli 
        To: GUFA List Member 
        Sent: Monday, December 10, 2007 1:31 PM
        Subject: [GUFA] ShellExecute


        Si tenes control del proceso externo , podes decir que cree una archivo 
culaquiera "esperando.txt" y de este lado mantener la aplicación mientras este 
archivo exista, antes de finalizar aquel proceso lo elimina y libera la 
aplicación de este lado.

        Si no tenes control sobre el proceso externo, no sé, porque son 
procesos asincronicos...

        Saludos
        José Cardaopoli
          ----- Original Message ----- 
          From: PabloC 
          To: GUFA List Member 
          Sent: Monday, December 10, 2007 12:49 PM
          Subject: [GUFA] ShellExecute


          Gente
          Como puede con el ShellExecute disparar un proceso externo y esperar 
a que termine para seguir?

          Saludos
          PabloC


          __________ Información de NOD32, revisión 2712 (20071209) __________

          Este mensaje ha sido analizado con NOD32 antivirus system
          http://www.nod32.com



    __________ NOD32 2713 (20071210) Information __________

    This message was checked by NOD32 antivirus system.
    http://www.eset.com

Responder a