dělám takový prográmek, který by měl spouštět jinou aplikaci. Problém je v tom, že ta konkrétní aplikace spustit nejde, všechny ostatní, které jsem zkoušel fungovali, jenom tato jedna ne.
Mohlo by to mít spojitost s tím, že aplikace (ta která mi nejde spustit) musí byt spuštěna ve své vlastní složce, která obsahuje jiné soubory, které spouští, jakmile ji přesunu jinam tak nefunguje.
Celé se to chová tak, že se provede příkaz pro spuštění aplikace, a pak už nic.
V cestě k souboru chyba určitě není, spíš jde o způsob jakým ji spustit.
No pokud ta aplikace vyžaduje další soubory, tak to asi obejít nepůjde a budeš ji muset spouštět na správném místě. Mimochodem, jak ten druhý program spouštíš (je spousta způsobů)?
Nepřesně jsem se vyjádřil. Já ji spouštím ve složce ve které má být. Prostě, když na ni normálně kliknu, tak to funguje a když ji v té samé složce spustím přes můj program, tak nefunguje. Chová se jako bych ji spouštěl v jiné složce.
Zkoušel jsem několik způsobů například:
ShellExecute(Handle, 'open', PChar('C:\Aplikace.exe'), nil, nil, SW_SHOWNORMAL); // nebo
WinExec(PChar('C:\Aplikace.exe'), SW_SHOWNORMAL);
dokonce jsem zkoušel i postup popsaný na této stránce (3. část):
Klikneš přímo na exe nebo na zástupce? Pokud na zástupce, může být aplikace spouštěna s parametrem a bez parametru nemusí fungovat správně.
hu
Edit: Pokud název exe souboru obsahuje mezeru, je třeba ho umístit do ", např. "nazev aplikace.exe", jinak je mezera považována za oddělovač mezi názvem exe a parametrem nebo mezi parametry.
Ještě poslední otázka, ja byste naše dosud získané poznatky aplikovali v této proceduře, případně navrhli alternativu.
prostě aby můj program čekal na ukončení toho, který spustil.
procedure ShellExecute_AndWait(FileName : String);
var
exInfo : TShellExecuteInfo;
Ph : DWORD;
begin
FillChar( exInfo, Sizeof(exInfo), 0 );
with exInfo do
begin
cbSize:= Sizeof( exInfo );
fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
Wnd := GetActiveWindow();
ExInfo.lpVerb := 'open';
lpFile:= PChar(FileName);
nShow := SW_SHOWNORMAL;
end;
if ShellExecuteEx(@exInfo) then
begin
Ph := exInfo.HProcess;
end
else
begin
ShowMessage(SysErrorMessage(GetLastError));
exit;
end;
while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
Application.ProcessMessages;
CloseHandle(Ph);
end;