Otwieranie programu exe z aplikacji

0

Witam,

mam taki problem, otóż chcę otworzyć inny program (konsolowy) z pozycji mojej aplikacji z automatycznym podawaniem nazwy pliku wejściowego, tj. po odpaleniu danego programu chcę aby aplikacja wpisywała w konsoli uruchomionego programu nazwę pliku i go zatwierdzała by go otworzyć.
ShellExecute nie robi tego, tylko otwiera program i staje, bo czeka na wpisanie nazwy pliku wejściowego z klawiatury, a chce żeby to było robione automatycznie z programu głównego. Piszę interfejs graficzny do programu konsolowego i mam z tym taki problem. Niestety programu nie da się uruchomić z parametrami wejściowymi, jak np. -i,input,file itd..
Macie jakiś pomysł?

Pzdr
PGR

1
prezesPGRu napisał(a)

tj. po odpaleniu danego programu chcę aby aplikacja wpisywała w konsoli uruchomionego programu nazwę pliku i go zatwierdzała by go otworzyć.

Czyli Twój program ma uruchamiać inny? Jeżeli tak, to możesz to wykonać za pośrednictwem ShellExecute; Nie rozumiem po co Ci to pośrednictwo konsoli; Chyba że nie o systemową konsolę chodzi? Nie bardzo rozumiem ten cytowany fragment.

0

Uzywam takiej o to komendy:
ShellExecute(handle, 'open', 'C:\CEA\FCEA2.exe', 'C:\CEA\input.txt', nil, SW_SHOWNORMAL);
po tym uruchamia się program FCEA2 ale czeka na wpisanie pliku wejściowego, gdy go wpisuję z klawiatury to program zamiast liczyć dalej to się zamyka.
Chciałbym aby automatycznie przy uruchamianiu pobierał dane z plike input.txt.
Gdy go uruchamiam z cmd w postaci "FCEA2.exe < input.txt" to wszystko działa dobrze. Pytanie jak to przenieść do Delphi7 ?

0

Czegoś nie rozumiesz w poście który podałem wyżej?

0

Rozumiem wszystko, spokojnie. Pytam, czy nie da się tego łatwiej zrobić niż przez CreateProcess?

2

W ciemno spróbuj

ShellExecute(handle, 'open', 'cmd', '/C start C:\CEA\FCEA2.exe < C:\CEA\input.txt', 'C:\CEA\', SW_SHOWNORMAL);

teoretycznie to jest odpowiednik tego samego co robiłeś ręcznie w wierszu polecenia.

0

Prościej - ręcznie.

0

To co napisał kAzek nie działa, reakcja jest taka sama jak w mojej wersji. Czyli startuje program ale nie jest podawany plik input.txt w pasku programu.

2

Powinno działać takie coś jak poniżej.

//...
function ExecNewProcess(ProgramName : string; CmdShow : longword) : DWORD;
var
  SI : TStartupInfo;
  PI : TProcessInformation;
begin
  ZeroMemory(@SI, SizeOf(SI));
  SI.cb := SizeOf(SI);
  SI.dwFlags := STARTF_USESHOWWINDOW;
  SI.wShowWindow := CmdShow;
  CreateProcess(nil, PChar(ProgramName), nil, nil, False, 0, nil, nil, SI, PI);
  Result := PI.dwProcessId;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ExecNewProcess('cmd.exe /K "date < D:\input.txt"', SW_SHOW);
end;

Pokazuje mi w konsoli gdzie w pliku input.txt mam samo "12" dla testów.

Bieżąca data: 2014-09-18
Wprowadź nową datę: (rr-mm-dd) 12
System nie może zaakceptować wprowadzonej daty.
Wprowadź nową datę: (rr-mm-dd)
C:\Program Files (x86)\DELPHI7\Projects>

Tylko oczywiście konsola nie zostanie zamknięta.

A i jak rozumiem, normalnie z pod cmd ten program działa ok, przyjmując input? Bo czasem programy mają inaczej stworzoną konsole przez co nie przyjmują przekierowań prawidłowo. Przykładowo program w Delphi stworzony ze zmienionymi modułąmi systemowymi z www.kolmck.net. Ewentualnie jeśli chcesz prościej. To sobie stwórz batcha (ręcznie lub poprzez kod w Delphi) i jego uruchamiaj. Może być wtedy nawet użyte ShellExecute.

2
prezesPGRu napisał(a):

To co napisał kAzek nie działa, reakcja jest taka sama jak w mojej wersji. Czyli startuje program ale nie jest podawany plik input.txt w pasku programu.

a czy w ogóle program odpalany z konsoli w podane wyżej sposoby działa?
wydaje mi się że program nie przyjmuje parametrów tylko chce nazwy pliku ze standardowego strumienia

w takim przypadku po prostu możesz wykorzystać program "echo" do wysłania komunikatu do strumienia:

echo C:\CEA\input.txt | C:\CEA\FCEA2.exe

0

Zrobiłem sobie plik .bat do uruchamiania tego programu z plikiem wejściowym i działa z cmd, jak to uruchomić w shellexecute?

1

Dostałeś już odpowiedź jak to można zrobić z CreateProcess. Dlaczego upierasz się przy ShellExecute? Być może brakuje w parametrach cudzysłowu. Po ShellExecute zobacz sobie co zwraca GetLastError i porównaj z listą kodów błędów na MSDNie.

0

Panowie, dziękuję za pomoc, udało się odpalić przez plik .bat z shellexecute, poniżej komenda:

ShellExecute(handle,'open','cea.bat',' ','C:\CEA\',SW_SHOWNORMAL);

Otwiera się i pobiera plik, i co najważniejsze dobrze liczy.
Dzięki za pomoc.
Pzdr

dodanie znacznika <code class="delphi"> - furious programming

0

Najpierw piszesz z sie nie da uruchomic programu z parametrami. Potem ze sie da.. Jesli nie chcesz mniec wiekszej kontroli nad uruchomionym programem to wystarczy ci shellexecute. Urucom w nim cmd.exe a w parametrze wszystko inne

0

@mca64 - pytacz napisał, że użycie ShellExecute bezpośrednio na pliku wykonywalnym nie działa prawidłowo; Dwa posty wyżej podał rozwiązanie z ShellExecute, ale uruchamiający plik skryptu, który to pośredniczy w rozruchu właściwej aplikacji;

Więc instrukcję ShellExeute można użyć, ale nie na pliku wykonywalnym, bo pewnie tak jak sugerował anonim kilka postów wcześniej - aplikacja może nie obsługiwać parametrów uruchomieniowych i trzeba to obejść.

0

wydaje mi sie ze powinno to dzialac

ShellExecute(0,nil,'cmd.exe','/c FCEA2.exe < input.txt',nil,sw_normal);

1 użytkowników online, w tym zalogowanych: 0, gości: 1