Ver Mensaje Individual
  #3  
Antiguo 29-05-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Reputación: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Yo hago lo que comenta Neftalí.
Si quiero ejecutarlo sin más utilizo:
Código Delphi [-]
ShellExecute(FMMain.Handle, nil, PChar(Fichero), nil, nil, SW_SHOW)
Ten en cuenta que el primer parámetro debe ser de un formulario. Yo utilizo el principal de la aplicación.

En otro momento quiero ejecutarlo y ver si el usuario ha cambiado algo (modificó el .DOC o .XLS por ejemplo)
En este caso obtengo un HASH del archivo (MD5) ejecuto mediante un procedimiento RunAndWait y luego obtengo el HASH nuevamente. Si son iguales es que no se ha modificado.
La función CalcHash es de Seoane.
Código Delphi [-]
         MD5 := CalcHash(Fichero, haMD5);
         RunAndWait(FMMain.Handle, Fichero, '');

         if (MD5 <> CalcHash(Fichero, haMD5)) then
         begin
            if (MessageDlg('El documento ha cambiado. ¿Quiere reemplazar el archivo en la base de datos?', mtConfirmation,
              [mbYes, mbNo], 0, mbYes) = mrYes) then
            begin
[...]

Te dejo el código que utilizo. No recuerdo de dónde lo saqué:

Código Delphi [-]
function TDMMain.RunAndWait(Handle: THandle; Ejecutable, Argumentos: string; const RunDirectory: PChar = nil;
  const Visibilidad: integer = sw_shownormal): DWORD;
var
   Info: TShellExecuteInfo;
   pInfo: PShellExecuteInfo;
   ExitCode: WORD;
begin
   { Puntero a Info }
   { Pointer to Info }
   pInfo := @Info;
   { Rellenamos Info }
   { Fill info }
   with Info do
   begin
      cbSize := SizeOf(Info);
      fMask := SEE_MASK_NOCLOSEPROCESS;
      wnd := Handle;
      lpVerb := nil;
      lpFile := PChar(Ejecutable);
      { Parametros al ejecutable }
      { Executable parameters }
      lpParameters := PChar(Argumentos + #0);
      if RunDirectory = '' then
         lpDirectory := nil
      else
         lpDirectory := PChar(RunDirectory + #0);
      nShow := Visibilidad;
      hInstApp := 0;
   end;
   { Ejecutamos }
   { Execute }
   if not ShellExecuteEx(pInfo) then
      Result := GetLastError
   else
      Result := Info.hInstApp;

   { Esperamos que termine }
   { Wait to finish }
   repeat
      ExitCode := WaitForSingleObject(Info.hProcess, 500);
      Application.ProcessMessages;
   until (ExitCode <> WAIT_TIMEOUT);
end;

Última edición por duilioisola fecha: 29-05-2014 a las 12:51:25. Razón: Agrego link a Web de autor
Responder Con Cita