Avatar billede neigaard Nybegynder
20. oktober 1999 - 09:59 Der er 12 kommentarer og
1 løsning

Stop et prog., fra et andet prog.

Jeg har et program der kører i baggrunden (uden forms), som jeg gerne vil stoppe fra et andet program (igen uden forms - ligger et icon ned i tray).

Hvordan gør jeg det???
Avatar billede blackthorne Nybegynder
21. oktober 1999 - 16:25 #1
Et skud fra hoften, kan du ikke sende en WM_ENDSESSION eller WM_QUERYENDSESSION til programmet
Avatar billede neigaard Nybegynder
21. oktober 1999 - 17:31 #2
Muligvis, men hvordan gør jeg det! Skal det andet prog. så stå og lytte efter messages, eller hvad?
Avatar billede snorga Nybegynder
22. oktober 1999 - 08:41 #3
Er det det det først program der starter det andet program?
Avatar billede neigaard Nybegynder
26. oktober 1999 - 10:34 #4
Nej ikke altid.
Avatar billede snorga Nybegynder
26. oktober 1999 - 12:52 #5
Øv.. Det ville have gjort det meget nemmer..

--

Så skal man have fat i alle processer der køre, der efter udvælge den man vil stoppe og så kalde den med en (WM_ENDSESSION eller WM_QUERYENDSESSION .. er der ikke en der hedder WM_QUIT?).

Hvordan du får process listen ved jeg ikke lige :( Men vis du finder ud af det vil jeg gerne vide hvordan :)
Avatar billede neigaard Nybegynder
27. oktober 1999 - 09:23 #6
Hmmm! Jeg kan godt få fat i process listen i Win95-98, men jeg ved ikke hvordan man gør i WinNT (og det er det jeg har brug for) :-(
Avatar billede snorga Nybegynder
27. oktober 1999 - 09:42 #7
Hvordan gør man det i windows9x?
Avatar billede neigaard Nybegynder
27. oktober 1999 - 11:55 #8
Følgende er taget direkte fra en bog, og er ikke afprøvet:

uses TlHelp32;

type
  TWin95Info = class(TInterfacedObject, IWin32Info)
  private
    FProcList: TList;
    FWinIcon: HICON;
    FSnap: THandle;
    procedure Refresh;
  public
    constructor Create;
    destructor Destroy; override;
    procedure FillProcessInfoList(ListView: TListView; ImageList: TImageList);
    procedure ShowProcessProperties(Cookie: Pointer);
  end;

implementation

uses ShellAPI, CommCtrl, SysUtils, Detail95;

const
  ProcessInfoCaptions: array[0..3] of string = (
    'ProcessName', 'Threads', 'ID', 'ParentID');

{ TProcList }

type
  TProcList = class(TList)
    procedure Clear; override;
  end;

procedure TProcList.Clear;
var
  I: Integer;
begin
  for I := 0 to Count - 1 do Dispose(PProcessEntry32(Items[I]));
  inherited Clear;
end;

{ TWin95Info }

constructor TWin95Info.Create;
begin
  FProcList := TProcList.Create;
  FWinIcon := LoadImage(0, IDI_WINLOGO, IMAGE_ICON, LR_DEFAULTSIZE,
    LR_DEFAULTSIZE, LR_DEFAULTSIZE or LR_DEFAULTCOLOR or LR_SHARED);
end;

destructor TWin95Info.Destroy;
begin
  DestroyIcon(FWinIcon);
  if FSnap > 0 then CloseHandle(FSnap);
  FProcList.Free;
  inherited Destroy;
end;

procedure TWin95Info.FillProcessInfoList(ListView: TListView;
  ImageList: TImageList);
var
  I: Integer;
  ExeFile: string;
  PE: TProcessEntry32;
  HAppIcon: HIcon;
begin
  Refresh;
  ListView.Columns.Clear;
  ListView.Items.Clear;
  for I := Low(ProcessInfoCaptions) to High(ProcessInfoCaptions) do
    with ListView.Columns.Add do
    begin
      if I = 0 then Width := 285
      else Width := 75;
      Caption := ProcessInfoCaptions[I];
    end;
  for I := 0 to FProcList.Count - 1 do
  begin
    PE := PProcessEntry32(FProcList.Items[I])^;
    HAppIcon := ExtractIcon(HInstance, PE.szExeFile, 0);
    try
      if HAppIcon = 0 then HAppIcon := FWinIcon;
      ExeFile := PE.szExeFile;
      if ListView.ViewStyle = vsList then
        ExeFile := ExtractFileName(ExeFile);
      // insert new item, set its caption, add subitems
      with ListView.Items.Add, SubItems do
      begin
        Caption := ExeFile;
        Data := FProcList.Items[I];
        Add(IntToStr(PE.cntThreads));
        Add(IntToHex(PE.th32ProcessID, 8));
        Add(IntToHex(PE.th32ParentProcessID, 8));
        if ImageList <> nil then
          ImageIndex := ImageList_AddIcon(ImageList.Handle, HAppIcon);
      end;
    finally
      if HAppIcon <> FWinIcon then DestroyIcon(HAppIcon);
    end;
  end;
end;

procedure TWin95Info.Refresh;
var
  PE: TProcessEntry32;
  PPE: PProcessEntry32;
begin
  FProcList.Clear;
  if FSnap > 0 then CloseHandle(FSnap);
  FSnap := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if FSnap = INVALID_HANDLE_VALUE then
    raise Exception.Create('CreateToolHelp32Snapshot failed');
  PE.dwSize := SizeOf(PE);
  if Process32First(FSnap, PE) then              // get process
    repeat
      New(PPE);                                  // create new PPE
      PPE^ := PE;                                // fill it
      FProcList.Add(PPE);                        // add it to list
    until not Process32Next(FSnap, PE);          // get next process
end;

procedure TWin95Info.ShowProcessProperties(Cookie: Pointer);
begin
  ShowProcessDetails(PProcessEntry32(Cookie));
end;
Avatar billede snorga Nybegynder
27. oktober 1999 - 12:13 #9
Tak, Nu mangler jeg bare tid til at finde det jeg skal bruge i det ..

Jeg -tror- ikke at det virker som det er..

Du er sikker på at det ikke kan bruges under NT?
Avatar billede neigaard Nybegynder
27. oktober 1999 - 20:46 #10
Det er klippet lidt ud af sammenheng, men hvis du er interesseret, kan jeg mail et kørende projekt?

De (Borland Press) påstår at det ikke kan!
Avatar billede snorga Nybegynder
28. oktober 1999 - 12:35 #11
Jo tak, du kan mail til snorga@students.aabc.dk

Det passe nok når de siger det... NT er lidt mere striks end win9x med hensyn til sikkerhed! Måske hvis man køre det i en DLL, de plejer at have højere systemadgang. Men så igen hvis NT ikke understytter det :(
Avatar billede snorga Nybegynder
10. november 1999 - 01:24 #12
Når du har ProcessID'et kan du lukke processen ned sådanne:
(ID=ProcessID, PHandle:Cardinal)

  PHandle := OpenProcess(PROCESS_TERMINATE,false,ID);
  If TerminateProcess(PHandle,1) then
    showmessage('Ok')
  else showmessage('Fail!');
  CloseHandle(PHandle);
Avatar billede neigaard Nybegynder
10. november 1999 - 12:22 #13
Det var jo bare det der skulle til... Hvorfor kunne vi ikke finde det API kald før?
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