Avatar billede ossys Mester
15. november 2018 - 12:14 Der er 5 kommentarer og
1 løsning

Delphi - Start og lukning af eksterne programmer

Jeg har (i Delhi) startet et eksternt program via ShellExecute. Hvordan lukker jeg det ned igen i Delphi?
Avatar billede falster Ekspert
15. november 2018 - 14:20 #1
Vist nok et hyppigt spm. uden en helt enkel løsning. Se f.eks. denne:

https://groups.google.com/forum/#!topic/borland.public.delphi.nativeapi.win32/Z2z3-VNFEMw

(Det allersidste indlæg med en midlertidig bat-fil, ligner en rigtig Storm P.-løsning.)

Ser frem til at andre giver deres besyv med :-)
Avatar billede arne_v Ekspert
15. november 2018 - 16:08 #2
Prov og skift fra ShellExecute til ShellExecuteEx.

Eksempel:


program shell;

uses
  ShellApi, Windows;

var
  sei : TShellExecuteInfo;

begin
  //ShellExecute(0, 'open', 'Notepad', nil, nil, SW_SHOWNORMAL);
  ZeroMemory(@sei, SizeOf(sei));
  sei.cbSize := SizeOf(TShellExecuteInfo);
  sei.lpVerb := 'open';;
  sei.lpFile := PChar('Notepad');
  sei.nShow := SW_SHOWNORMAL;
  ShellExecuteEx(LPShellExecuteInfoA(@sei)); // LPShellExecuteInfoA cast may not needed or good
  Sleep(15000);
  PostMessage(sei.hProcess, WM_QUIT, 0, 0);
end.
Avatar billede arne_v Ekspert
15. november 2018 - 16:12 #3
Ups - virker ikke.
Avatar billede arne_v Ekspert
15. november 2018 - 17:40 #4
Nyt forsoeg:


program shell;

uses
  ShellApi, Windows;

function MyGetProcessId(Process: HANDLE ): DWORD; external kernel32 name 'GetProcessId';

function kill(wnd: HWND; prc: LPARAM): BOOL; StdCall;

var
  id : LONGWORD;

begin
  GetWindowThreadProcessId(wnd, @id);
  writeln(prc, ' ', id);
  if prc = id then begin
    PostMessage(wnd, WM_QUIT, 0, 0);
  end;
  result := true;
end;

var
  sei : TShellExecuteInfo;

begin
  //ShellExecute(0, 'open', 'Notepad', nil, nil, SW_SHOWNORMAL);
  ZeroMemory(@sei, SizeOf(sei));
  sei.cbSize := SizeOf(TShellExecuteInfo);
  sei.lpVerb := 'open';;
  sei.lpFile := PChar('Notepad');
  sei.fMask := SEE_MASK_NOCLOSEPROCESS;
  sei.nShow := SW_SHOWNORMAL;
  ShellExecuteEx(LPShellExecuteInfoA(@sei)); // LPShellExecuteInfoA cast may not needed or good
  Sleep(15000);
  //PostMessage(sei.hProcess, WM_QUIT, 0, 0);
  EnumWindows(@kill, MyGetProcessId(sei.hProcess));
end.
Avatar billede ossys Mester
27. marts 2019 - 22:40 #5
@ arne_v
Undskyld en noget forsinket reaktion, p.gr.a.. private årsager. Jeg kan ikke få din løsning til at virke. Har du afprævet løsningen?
Avatar billede arne_v Ekspert
14. april 2019 - 04:14 #6
Ja.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester