Jak z poziomu Lazarus uruchomić inny program z parametrem

0

Witam,
Mam problem z uruchomieniem programu z poziomu Lazarus z parametrami

WinExec('C:\ccvt.exe c:\plik.dat c:\plik.dbf', SW_SHOW); 

Sam program bez parametrów "c:\plik.dat c:\plik.dbf" uruchamia się bez problemowo.

Wspomagałem się tym postem
http://4programmers.net/Delphi/faq/Jak_z_poziomu_delphi_uruchomi%C4%87_inny_program_

0

Do uruchomienia programu z parametrami wykorzystaj ShellExecute

0
kult napisał(a):

Do uruchomienia programu z parametrami wykorzystaj ShellExecute

Tylko bez tych nieportowalnych rozwiązań w które się Delphi bawi!

TProcess ma wszystko i to multiplatformowo.

1

Przykładowy kod poniżej. Sprawdziłem i działa ok pod Lazarusem 64 bitowym.

//...

{$MODE DELPHI}

uses
  Windows;

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;

Przykład użycia:

   ExecNewProcess('cmd.exe /C pause', SW_SHOW);
0

@olesio, 1. Lazarus to nie jest Delphi gdzie jest wyłącznie Windows. Więc zapewne działa ci na Lazarusie 64bit Windows.
2. TProcess gwarantuje lepszą drogę niż WinAPI i zawiera praktycznie wszystko co można sobie wymarzyć.

0

Jest jeszcze ExecuteProcess, znacznie prostsze i chyba też wieloplatformowe.

0

@3y4hsg skoro autor próbował użyć WinExec raczej nie myślał o innych niż Windows platformach bo oczywiste jest i o tym piszą: While FPC/Lazarus has support for CreateProcess, ShellExecute and/or WinExec, this support is only in Win32/64. If your program is cross-platform, consider using TProcess. A w czym sądzisz że użycie tego TProcess będzie lepsze niż bezpośrednie wywołanie WinApi gdy pisze aplikację pod Windows? W tym że jest bardziej rozbudowany o nie istotne dla autora pytania właściwości i metody?

0

@3y4hsg skoro autor próbował użyć WinExec raczej nie myślał o innych niż Windows platformach bo oczywiste jest i o tym piszą:

Nie, to znaczy wyłącznie tyle że autor usiłuje użyć wyłącznie rozwiązań made in bigcorp [Delphi]. Często stosuję TProcess, mimo że nie oczekuję wieloplatformowości (po prostu jest lepszy). TProcess jest słabo opisany na necie, stąd niewiele osób tego używa. Więc z każdej strony twoje argumentowanie jest bez sensu, bo TProcess nie wymusza stosowania dziwnych rzeczy w celu osiągnięcia multiplatformowości, zapewne autor po prostu nie zna swojego środowiska.

A w czym sądzisz że użycie tego TProcess będzie lepsze niż bezpośrednie wywołanie WinApi gdy pisze aplikację pod Windows?

  1. Nie musisz konwertować parametrów na PChar.
  2. Brak dziwnych kodów wyjścia, wszystko jest konwertowane na natywne dla FPC.
  3. Więcej opcji.
  4. Wieloplatformowość gratis.
  5. Brak potrzeby szukania dokumentacji na MSDN, TProcess dba o poprawne rozwiązywanie takich pierdół jak ścieżki ze spacjami etc.

W tym że jest bardziej rozbudowany o nie istotne dla autora pytania właściwości i metody?

  1. Nie wiesz co autor pisze i jaki problem usiłuje rozwiązać.
  2. TProcess warto znać bo się przydaje od prostych po zaawansowane zadania.
  3. Jeżeli nie teraz to następnym razem przyda ci się inna właściwość.

W ogóle to można się kAzek zastanawiać: A po co ci Synapse czy Indy? Czemu nie używasz do tego WinAPI? No właśnie, ten sam zestaw odpowiedzi.

0
kult napisał(a):

Do uruchomienia programu z parametrami wykorzystaj ShellExecute

Do uruchomienia innej aplikacji ShellExecute może być ale jeśli chodzi o parametry już sobie rady nie daje.

olesio napisał(a):

Przykładowy kod poniżej. Sprawdziłem i działa ok pod Lazarusem 64 bitowym.

//...

{$MODE DELPHI}

uses
  Windows;

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;

Przykład użycia:

   ExecNewProcess('cmd.exe /C pause', SW_SHOW);

Olesio twoje rozwiązanie jest jak najbardziej trafne, działa program z parametrami bez najmniejszego problemu.

Post chciałem już zamykać, lecz nie wiedziałem że tak burzliwą dyskusję wprowadzi.

kAzek masz rację program będzie używany tylko w środowisku windows, choć
ma za zadanie uruchomić program dosowy.

3y4hsg będę wdzięczny za podpowiedzi lub przykłady jak stosować TProcess.

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