Błąd przy zamykaniu procesu

dział ogólny

Błąd przy zamykaniu procesu

Nowy postprzez Andrev01 » sobota, 14 marca 2009, 23:47

Witam,

Mam taki, poniższy kod, ktory ma zamknąć aplikację explorer.exe - zamyka, jednak zwraca mi mały błąd w postaci okienka z napisem "System Error, Code: 1400 / Nieprawidłowe dojście do okna" - wydaje mi się, że to nie moja aplikacja, ale system zwraca taki błąd. Dlaczego? Poniżej kod jaki wykonuję:

Kod: Zaznacz cały
void __fastcall GetProcess(TStrings *ProcList)
{
HWND Snap;
PROCESSENTRY32 proces;

Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
proces.dwSize = sizeof(PROCESSENTRY32);

if(Process32First(Snap, &proces))
{
  do
  {
   if(proces.szExeFile[0] != '[')
   {
    ProcList->Add((String)(String)proces.szExeFile + "=" + (String)proces.th32ProcessID);
   }
  }
  while(Process32Next(Snap , &proces));
}
CloseHandle(Snap);
}
//---------------------------------------------------------------------------
bool CloseProcess(DWORD ID)
{
DWORD ExitCode;
HWND hWnd;
bool Result = true;

if(ID)
{
  hWnd = OpenProcess(PROCESS_ALL_ACCESS, true, ID);
  if(hWnd)
  {
   GetExitCodeProcess(hWnd, &ExitCode);
   Result = TerminateProcess(hWnd, ExitCode);
  }
  else return false;
}
else return false;

CloseHandle(hWnd);
return Result;
}


Oczywiście mam:

Kod: Zaznacz cały
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
WindowList = new TStringList;
}


i zadeklarowane:

Kod: Zaznacz cały
private:   // User declarations

TStringList *WindowList;


A to jest wywołanie:

Kod: Zaznacz cały
try
                {
                WindowList->Clear();

                GetProcess(WindowList);
                CloseProcess((DWORD)WindowList->Values["explorer.exe"].ToInt());
                }
                catch(...)
                {
                }


Co zrobić, by nie pojawiał się ten błąd?
Avatar użytkownika
Andrev01
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): sobota, 14 marca 2009, 20:44
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Błąd przy zamykaniu procesu

Nowy postprzez Cyfrowy Baron » niedziela, 15 marca 2009, 09:23

Kod wydaje się prawidłowy, więc to raczej system, aczkolwiek u mnie taki błąd się nie pojawia, wiec to musi być coś z konfiguracją systemu. Czy nie korzystasz przypadkiem z systemu Vista?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Błąd przy zamykaniu procesu

Nowy postprzez Andrev01 » niedziela, 15 marca 2009, 10:23

Nie, mam Windows XP. W sumie jeśli to tylko u mnie tak się dzieje, to trudno - i tak nie będę używać tej funkcji na swoim Windowsie ;)
Avatar użytkownika
Andrev01
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): sobota, 14 marca 2009, 20:44
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Błąd przy zamykaniu procesu

Nowy postprzez Cyfrowy Baron » niedziela, 15 marca 2009, 11:09

Jeżeli chcesz zamknąć tylko pojedynczy proces, to nie bardzo widzę sens tworzenia listy wszystkich procesów. Po niewielkiej modyfikacji kodu, można stworzyć funkcję, która będzie zamykała proces w oparciu o nazwę procesu:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
#include <tlhelp32.h>
void __fastcall CloseProcess(String ProcesName)
{
  HWND Snap;
  PROCESSENTRY32 proces;

  Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  proces.dwSize = sizeof(PROCESSENTRY32);

  if(Process32First(Snap, &proces))
  {
   do
   {
    if(proces.szExeFile[0] != '[')
    {
    if(SameText((String)proces.szExeFile, ProcesName))
    {
      HWND hWnd = OpenProcess(PROCESS_ALL_ACCESS, true, proces.th32ProcessID);
      if(hWnd)
      {
        TerminateProcess(hWnd, ExitCode);
      }
      else return;
      CloseHandle(hWnd);
      return;
    }
     }
   }
   while(Process32Next(Snap , &proces));
  }
  CloseHandle(Snap);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   CloseProcess("explorer.exe");
}
//---------------------------------------------------------------------------


Tak jest znacznie prościej.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości