Jak uruchomić w naszej aplikacji inny program jako modalny?

0

Witam, znacie jakies tricki jak uruchomić w naszej aplikacji inny program jako modalny?

znalazłem coś takiego, ale nie chce się kompilować, albo jestem zbyt nawalony za co przepraszam ;D

function EditAndWait(const AFileName : string) : boolean;
var
  Info: TShellExecuteInfo;
begin
  FillChar(Info, SizeOf(Info), 0);
  Info.cbSize := SizeOf(Info);
  Info.lpVerb := 'edit';
  Info.lpFile := PAnsiChar(AFileName);
  Info.nShow := SW_SHOW;
  Info.fMask := SEE_MASK_NOCLOSEPROCESS;
  Result := ShellExecuteEx(@Info);
  if(Result) and (Info.hProcess <> 0) then 
  begin
    WaitForSingleObject(Info.hProcess, Infinite);
    CloseHandle(Info.hProcess);
  end;
end;

2

Funkcja jest ok, tylko zmień tą linie kodu.

Info.lpFile := PAnsiChar(AFileName);

Zamiast tego daj

Info.lpFile := PChar(AFileName);

ja bym ta funkcje zdefiniował tak.

function UseAndWait(const AFileName: string; Action: string = 'open'): Boolean;
var
  Info: TShellExecuteInfo;
begin
  FillChar(Info, SizeOf(Info), 0);
  Info.cbSize := SizeOf(Info);
  Info.lpVerb := PChar(Action);
  Info.lpFile := PChar(AFileName);
  Info.nShow := SW_SHOWNORMAL;
  Info.fMask := SEE_MASK_NOCLOSEPROCESS;
  Result := ShellExecuteEx(@Info);
  if (Result) and (Info.hProcess <> 0) then begin
    WaitForSingleObject(Info.hProcess, Infinite);
    CloseHandle(Info.hProcess);
  end;
end;

1

Wątek dotyczy co prawda Delphi, ale wiem jak to zrobić w Lazarusie — można skorzystać z klasy TProcess i ona daje możliwość poczekania aż wywołany proces zakończy działanie lub go uruchomić bez czekania. Jest też wersja dla Delphi, przeportowana z Free Pascala. W razie czego, możesz podglądnąć źródła i skorzystać tylko z tego czego potrzebujesz.

Rozwiązanie w czystym Win32 API znajdziesz np. tutaj — https://stackoverflow.com/a/17339308/19103115

0

Dzięki Panowie za podpowiedz, dzięki wam podołam :)

0
first_person napisał(a):

[…] tylko zmień tą linie kodu.

Info.lpFile := PAnsiChar(AFileName);

Zamiast tego daj

Info.lpFile := PChar(AFileName);

IMO nie bardzo. Nie mam Delphi, więc nie sprawdzę, ale ShellExecuteEx to alias ShellExecuteExA, czyli wersji obsługującej kodowanie ANSI, czyli o codepointach jednobajtowych. W Delphi typ PChar jest aliasem PWideChar, czyli jest to wskaźnik na ciąg znaków z dwubajtowymi codepointami i dla takich ciągów przeznaczone są funkcje WinAPI z postfiksem W, np. ShellExecuteExW.

Tak więc jeśli ciąg jest kodowany w ANSI, to należy skorzystać z ShellExecuteEx(A), a jeśli w Unicode, to z ShellExecuteExW. Trzeba patrzeć po typach parametrów — LPCSTR jest dla ANSI, LPCWSTR dla Unikodu.

0

@furious programming:
ale @first_person ma racje.

Jeżeli dasz PAnsiChar kompilator da taki komunikat.
Incompatible types: 'PWideChar' and 'PAnsiChar'

Sprawdziłem, wszystko ok
image

EDIT:
@furious programming:

Piszesz ze nie masz Delphi, Delphi od Borlanda to już przeżytek.
Zainstaluj sobie Rad Studio, ciąglę jest rozwijany
https://www.embarcadero.com/products/rad-studio/whats-new-in-11-alexandria

Mozesz kodzic w nim zarówno w Object Pascalu jak i C++

Fajnie w nim mozna kodzic, dla przykladu

procedure test;
begin
  for var i := 0 to 100 do begin
  // jakis kod.
  end;

  var s :=       'siemano';
  var f :=        11.2;
  var number :=   120 * 765 mod 10;

 // itd itd
end;

0
Observer2323 napisał(a):

@furious programming:
ale @first_person ma racje.

Jeżeli dasz PAnsiChar kompilator da taki komunikat.
Incompatible types: 'PWideChar' and 'PAnsiChar'

No właśnie — nie powinieneś używać typów z Ansi w nazwie, skoro Delphi od bardzo dawna używa Wide znaków i ciągów jako domyślnych dla Char i String. Wszystko co napisałem w poście wyżej jest prawidłowe, tak samo jak sugestia @first_person, bo zapewne pole Info.lpFile jest zadeklarowane jako PChar, który jest aliasem PWideChar.

Piszesz ze nie masz Delphi, Delphi od Borlanda to już przeżytek.

No bo nie mam — dawno temu porzuciłem Delphi na rzecz Lazarusa i Free Pascala. ;)

0

@first_person:

o nowa wersja, dotychczas jechalem na 11 :)

0

Ale nowej wersji Community Edition nie będzie pewnie przez 1-2 lata, jak było z 11.3

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