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
pInfo := @Info;
with Info do
begin
cbSize := SizeOf(Info);
fMask := SEE_MASK_NOCLOSEPROCESS;
wnd := Handle;
lpVerb := nil;
lpFile := PChar(Ejecutable);
lpParameters := PChar(Argumentos + #0);
if RunDirectory = '' then
lpDirectory := nil
else
lpDirectory := PChar(RunDirectory + #0);
nShow := Visibilidad;
hInstApp := 0;
end;
if not ShellExecuteEx(pInfo) then
Result := GetLastError
else
Result := Info.hInstApp;
repeat
ExitCode := WaitForSingleObject(Info.hProcess, 500);
Application.ProcessMessages;
until (ExitCode <> WAIT_TIMEOUT);
end;