![]() |
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: |
Re: explorer.exe beenden und wieder starten
Zitat:
![]() |
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:
|
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.
|
Re: explorer.exe beenden und wieder starten
Zitat:
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 ._. |
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. |
Re: explorer.exe beenden und wieder starten
dazu gibts bei uns ja die Codelib ;)
![]() 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; |
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.
|
Re: explorer.exe beenden und wieder starten
geht das auch irgendwie mit dem Prozessnamen?
|
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 10:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz