Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi explorer.exe beenden und wieder starten (https://www.delphipraxis.net/68679-explorer-exe-beenden-und-wieder-starten.html)

qubeus 3. Mai 2006 18:01


explorer.exe beenden und wieder starten
 
Hi Leute!!

Eines der hauptsächlichen Gründe dafür, dass ich Windows nicht mag ist der explorer ... ich weiß zwar, dass es freeware gibt, die den explorer versucht zu ersetzen, aber alle Funktionen beherrscht sie nicht. Andere Programme sind oft kostenpflichtig was auch der Grund dafür ist, dass ich sie noch nicht testen konnte, aber ganz abgesehen davon bin ich nicht bereit ein solches Programm zu kaufen.

Der explorer verursacht bei mir oft Probleme, wenn ich Dateien löschen will, meist steht das, dass die Dateien von einem Programm benutzt werden, de tatsächliche Grund ist aber der explorer, wenn ich ihn nämlich neu starte, sind die Dateien entweder gelöscht, weil er sie vorher schon gelöscht hat, dies aber nur wegen eines Fehlers nicht erkannt hat oder die Dateien lassen sich dann problemlos löschen. Außerdem gibt es oft Probleme beim Leeren des Papierkorbs. Die Fehler sind auf jeden Fall durch den explorer selbst verursacht, diese waren nämlich schon da als ich die Festplatte das letzte mal formatiert hatte und Windows neu drauf gemacht habe.
Es handelt sich oft um Dateien von 5 GB (TV-Karten-Aufnahmen) die ich lösche, vielleicht hängt es damit zusammen, aber das spielt ja keine Rolle, der explorer sollte mit allen Dateiengrößen umgehen können.

Die einzige Lösung für mich im Moment ist es, mühsam im Taskmanager jedes Mal wenn das Problem auftritt den explorer zu beenden und ihn anschließend wieder mit "Ausführen" im TaskManager mit dem Befehl "explorer.exe" zu starten.

Da mir das etwas zu mühsam ist würde ich gerne ein Delphi-Programm machen, dass diese Arbeit verrichtet, dieses kann ich dann immer mit einem Shortcut aufrufen, wenn das Problem auftritt.

Wie man ein Programm mit Delphi startet weiß ich, aber wie ich eins beende weiß ich nicht.
Ich stelle es mir kompliziert vor eine allgemeine Lösung für das Beenden von beliebigen Programmen zu finden, aber das Beenden des explorers ist vermutlich auf jedem PC gleich und könnte vielleicht etwas einfacher auch von anderen Leuten realisiert werden.

Also meine Bitte ist: Sagt mir wie man die explorer.exe mit Delphi beendet.

Lösungen zur Behebung des explorer-Problems selbst sind auch gerne gesehen.

Ich hoffe jetzt auf eure Hilfe! :thumb:

Alexander Roth 3. Mai 2006 18:30

Re: explorer.exe beenden und wieder starten
 
Zitat:

Der explorer verursacht bei mir oft Probleme, wenn ich Dateien löschen will, meist steht das, dass die Dateien von einem Programm benutzt werden, de tatsächliche Grund ist aber der explorer, wenn ich ihn nämlich neu starte, sind die Dateien entweder gelöscht, weil er sie vorher schon gelöscht hat, dies aber nur wegen eines Fehlers nicht erkannt hat oder die Dateien lassen sich dann problemlos löschen. Außerdem gibt es oft Probleme beim Leeren des Papierkorbs. Die Fehler sind auf jeden Fall durch den explorer selbst verursacht, diese waren nämlich schon da als ich die Festplatte das letzte mal formatiert hatte und Windows neu drauf gemacht habe.
Es handelt sich oft um Dateien von 5 GB (TV-Karten-Aufnahmen) die ich lösche, vielleicht hängt es damit zusammen, aber das spielt ja keine Rolle, der explorer sollte mit allen Dateiengrößen umgehen können.
Dafür gibt es eine viel bessere Lösung: siehe hier Unlocker

qubeus 3. Mai 2006 19:28

Re: explorer.exe beenden und wieder starten
 
Ich bedanke mich schonmal für die erste und nette Hilfe - das Programm scheint recht gut zu sein, ich teste es gleich mal - aber ich wäre trotzdem an dem Programmcode, zur Beantwortung der Frage, interessiert. :thumb:

Mystic 3. Mai 2006 19:32

Re: explorer.exe beenden und wieder starten
 
Du hast nicht zufällig Norton Antivirus? Als ich das noch benutzt hab, hatte ich öfters die genannten Probleme. Seit ich auf F-Secure und Anti-Vir umgestiegen bin, nicht mehr.

himitsu 3. Mai 2006 19:35

Re: explorer.exe beenden und wieder starten
 
Zitat:

Zitat von qubeus
Es handelt sich oft um Dateien von 5 GB (TV-Karten-Aufnahmen) die ich lösche, vielleicht hängt es damit zusammen, aber das spielt ja keine Rolle, der explorer sollte mit allen Dateiengrößen umgehen können.

Der kann schon damit umgehen, allerdings schaut der sich immer den dateiinhalt an, wenn man eine Datei in ihm markiert, um dann einige mehr, oder weniger sinnvolle Informationen ber diese Datei in der Stausleiste, oder disen Webansichtteil anzuzeigen.

Du müßtest also nur warten, bis er damit fertig ist und dann gehts auch so ('s dauert bei großen Dateien halt nur ein kleines bissl länger :roll: )

[add]
ja, die AntiVirenDinger gucken sich och die dateien des öfteren an, wenn man reinguckt (wie es z.B. der explorer macht) und dann dauert's noch ein bissl länger ._.

qubeus 3. Mai 2006 19:36

Re: explorer.exe beenden und wieder starten
 
Das Problem an sich ist behoben, mich würde es jetzt nur mal interessieren, ob man mit Delphi Prozesse z.B. explorer.exe killen kann.

@himitsu: damit hat das garnichts zu tun, das hat auch nichts mit warten zu tun... die informationen usw. werden alle korrekt angezeigt. Das liegt daran, dass das löschen durch irgendwelche Fehler gesperrt wird...deshalb ist es auch gut, dass mir Alexander Roth ein Tool zum Entsperren empfohlen hat.

ichbins 3. Mai 2006 19:39

Re: explorer.exe beenden und wieder starten
 
dazu gibts bei uns ja die Codelib ;)


prozess beendenprozess beenden :wall: keine Ergebnisse :oops:

mal'n Codeschnipsel von Luckie:

Delphi-Quellcode:
{
  Author : Michael Puff - [url]http://developer.luckie-online.de[/url]
  Date   : 2005-05-29
  License : PUBLIC DOMAIN
}


uses
  PSAPI, TlHelp32;

type
  TPIDList = array of DWORD;
  TStringDynArray = array of string;

function GetProcessID(const ProcName: string; var ID: DWORD): DWORD;
var
  hProcSnap: THandle;
  pe32: TProcessEntry32;
  dw: DWORD;
begin
  dw := 0;
  hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  if hProcSnap = 0 then
  begin
    pe32.dwSize := SizeOf(ProcessEntry32);
    if Process32First(hProcSnap, pe32) then
    begin
      while Process32Next(hProcSnap, pe32) do
      begin
        if pos(ProcName, pe32.szExeFile) <> 0 then
        begin
          ID := pe32.th32ProcessID;
          break;
        end;
      end;
    end
    else // Process32First = False
      dw := GetLastError;
    CloseHandle(hProcSnap);
  end
  else // hSnapShot = INVALID_HANDLE_VALUE
    dw := GetLastError;
  result := dw;
end;

function KillProcess(dwProcID, Wait: DWORD): Integer;
var
  hProcess: Cardinal;
  dw: DWORD;
begin
  // open the process and store the process-handle
  hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, dwProcID);
  // kill it
  if hProcess <> 0 then
  begin
    dw := Integer(TerminateProcess(hProcess, 1));
    if dw <> 0 then
    begin
      // TerminateProcess returns immediately, so wie have to verify the result via
      // WaitForSingleObject
      dw := WaitForSingleObject(hProcess, Wait);
      if dw = WAIT_FAILED then
        dw := GetLastError;
    end
    else // TerminateProcess = 0
      dw := GetLastError;
    CloseHandle(hProcess);
  end
  else // hProcess = INVALID_HANDLE_VALUE
    dw := GetLastError;
  result := dw;
end;

function GetProcessName(PID: DWORD; var ProcessName: string): DWORD;
var
  dwReturn: DWORD;
  hProcSnapShot: THandle;
  pe32: TProcessEntry32;
begin
  dwReturn := 0;
  hProcSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if hProcSnapShot <> INVALID_HANDLE_VALUE then
  begin
    pe32.dwSize := sizeof(TProcessEntry32);
    if Process32First(hProcSnapShot, pe32) then
    begin
      // first process
      if PID = pe32.th32ProcessID then
      begin
        ProcessName := pe32.szExeFile;
      end;
      // first process wasn't the one we wanted
      // walk the rest
      if ProcessName <> '' then
      begin
        // walk the processes
        while Process32Next(hProcSnapShot, pe32) do
        begin
          // found process
          if PID = pe32.th32ProcessID then
          begin
            ProcessName := pe32.szExeFile;
            // exit
            break;
          end;
        end;
      end;
    end
    else // Process32First = False
      dwReturn := GetLastError;
    CloseHandle(hProcSnapShot);
  end
  else // hSnapShot = INVALID_HANDLE_VALUE
    dwReturn := GetLastError;
  result := dwReturn
end;

function GetProcessList(var ProcessList: TPIDList): DWORD;
var
  dwReturn: DWORD;
  hProcSnapShot: THandle;
  pe32: TProcessEntry32;
  j: Cardinal;
begin
  dwReturn := 0;

  // make the snapshot
  hProcSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if hProcSnapShot <> INVALID_HANDLE_VALUE then
  begin
    pe32.dwSize := sizeof(TProcessEntry32);
    j := 0;
    setlength(ProcessList, j + 1);
    if Process32First(hProcSnapShot, pe32) then
    begin
      // first process
      ProcessList[j] := pe32.th32ProcessID;
      // walk the processes
      while Process32Next(hProcSnapShot, pe32) do
      begin
        Inc(j);
        setlength(ProcessList, j + 1);
        ProcessList[j] := pe32.th32ProcessID;
      end;
    end
    else // Process32First = False
      dwReturn := GetLastError;
    CloseHandle(hProcSnapShot);
  end
  else // hSnapShot = INVALID_HANDLE_VALUE
    dwReturn := GetLastError;

  result := dwReturn;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  retValue: DWORD;
  ProcessList: TPIDList;
  i: Integer;
  ProcessName: string;
resourcestring
  rsUnknown = 'unbekannt';
begin
  // VCL causes last error to be set, even nothing has already happend :-/
  SetLastError(0);
  Listbox1.Clear;
  retValue := GetProcessList(ProcessList);
  if retValue = 0 then
  begin
    for i := 0 to length(ProcessList) - 1 do
    begin
      if GetProcessName(ProcessList[i], ProcessName) <> 0 then
        ProcessName := rsUnknown;
      Listbox1.Items.Add(IntToStr(ProcessList[i]) + ' - ' + ProcessName);
    end;
  end
  else
    ShowMessage(SysErrorMessage(retValue));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  dw: DWORD;
begin
  dw := KillProcess(StrToInt(Edit1.Text), 5000);
  if dw <> 0 then
    ShowMessage(SysErrorMessage(dw));
  Button1.Click;
end;

qubeus 3. Mai 2006 19:41

Re: explorer.exe beenden und wieder starten
 
Wenn ich auf diesen Link klicke steht da: Keine Beiträge entsprechen Deinen Kriterien. -edit- Ah jetzt ist der Code ja oben eingeblendet.

delphis spassbremse 15. Sep 2006 06:13

Re: explorer.exe beenden und wieder starten
 
geht das auch irgendwie mit dem Prozessnamen?

Luckie 15. Sep 2006 08:08

Re: explorer.exe beenden und wieder starten
 
Klar, dazu mus sman sich nur mal meinen Code etwas genauer angucken. Du hast ja die Liste mit den IDs der prozesse, die gehts du mit der Funktion function GetProcessName(PID: DWORD; var ProcessName: string): DWORD; durch. Wenn du deinen Dateinamen gefunden hast, kennst du auch die ID dazu und kannst diese dann benutzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz