Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Zugriffsverletzung beim Ermitteln von Prozessen (https://www.delphipraxis.net/158978-zugriffsverletzung-beim-ermitteln-von-prozessen.html)

Andidreas 10. Mär 2011 08:12

Zugriffsverletzung beim Ermitteln von Prozessen
 
hallo zusammen,

ich habe mir vor eineiger zeit die folgende funktion gebastelt über die ich mir ermitteln kann wie oft ein programm auf einem rechner läuft
(als grundlage für diese funktion habe ich damals eine dp beitrag verwendet denn ich leider nicht mehr finde)

Delphi-Quellcode:
function fnGetNoOfSameProgramProcesses(sProgramName : String) : Integer;

var
i, j, k                  : Integer;
sPathProgram             : String;
hModuleSnap, hProcessSnap : THandle;
ProcessEntry             : TProcessEntry32;
ModuleEntry              : TModuleEntry32;

begin

  i := 0;
  j := 0;
  k := 0;

  //Get Process IDs
  hProcessSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);

  If hProcessSnap <> INVALID_HANDLE_VALUE Then
  Begin
    ProcessEntry.dwSize := SizeOf(ProcessEntry32);
    If Process32First(hProcessSnap, ProcessEntry) Then
    Begin
      While Process32Next(hProcessSnap, ProcessEntry) Do
      Begin

        //Get .exe Names for Process IDs and Count the same Programs
        hModuleSnap := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, ProcessEntry.th32ProcessID);
        If hModuleSnap <> INVALID_HANDLE_VALUE Then
        Begin
          ModuleEntry.dwSize := SizeOf(ModuleEntry32);
          Module32First(hModuleSnap, ModuleEntry);
          sPathProgram := (ModuleEntry.szExePath);
          For i := 0 To Length(sPathProgram) Do
          Begin
            If sPathProgram[i] = '\' Then j := i;
          End;
          If UpperCase(Copy(sPathProgram, j + 1, Length(sPathProgram))) = UpperCase(sProgramName) Then k := k + 1;
          CloseHandle(hModuleSnap);
        End;

      End;
    End;
    CloseHandle(hProcessSnap);
  End;

  Result := k;

end;
prinzipiell funktioniert diese funktion auch...
allerdings hab ich jetzt feststellen müssen das ich in manchen fällen eine zugriffsverletzung erhalte... leider kann ich nicht feststellen wann so ein fall eintritt... im moment hab ich so das gefühl wie wenn diese fälle nur sporadisch auftreten...

hat jemand eine idee woran das liegen könnte? habe ich einen fehl in meinem code?

mleyen 10. Mär 2011 08:21

AW: Zugriffsverletzung beim Ermitteln von Prozessen
 
Zitat:

Zitat von Andidreas (Beitrag 1087196)
Delphi-Quellcode:
          For i := 0 To Length(sPathProgram) Do
          Begin
            If sPathProgram[i] = '\' Then j := i;
          End;

Strings fangen bei 1 an.

DeddyH 10. Mär 2011 08:22

AW: Zugriffsverletzung beim Ermitteln von Prozessen
 
Zitat:

Delphi-Quellcode:
For i := 0 To Length(sPathProgram) Do

Strings beginnen bei 1 und nicht bei 0.

Blup 10. Mär 2011 08:28

AW: Zugriffsverletzung beim Ermitteln von Prozessen
 
Der Rückgabewert von "Module32First" wird nicht geprüft.
Deshalb ist der Zugriff auf "ModuleEntry.szExePath" danach eventuell unzulässig.

Andidreas 10. Mär 2011 13:26

AW: Zugriffsverletzung beim Ermitteln von Prozessen
 
vielen dank für eure antworten...
hab das folgende angepasst:
- String bei 1 beginnen -->
Delphi-Quellcode:
For i := 1 To Length(sPathProgram) Do
- Rückgabe Wert von Modul32First prüfen -->
Delphi-Quellcode:
If Module32First(hModuleSnap, ModuleEntry) = True Then
hier nochmals die komplette funktion:
Delphi-Quellcode:
function fnGetNoOfSameProgramProcesses(sProgramName : String) : Integer;

var
i, j, k                  : Integer;
sPathProgram             : String;
hModuleSnap, hProcessSnap : THandle;
ProcessEntry             : TProcessEntry32;
ModuleEntry              : TModuleEntry32;

begin

  i := 0;
  j := 0;
  k := 0;

  //Get Process IDs
  hProcessSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);

  If hProcessSnap <> INVALID_HANDLE_VALUE Then
  Begin
    ProcessEntry.dwSize := SizeOf(ProcessEntry32);
    If Process32First(hProcessSnap, ProcessEntry) Then
    Begin
      While Process32Next(hProcessSnap, ProcessEntry) Do
      Begin

        //Get .exe Names for Process IDs and Count the same Programs
        hModuleSnap := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, ProcessEntry.th32ProcessID);
        If hModuleSnap <> INVALID_HANDLE_VALUE Then
        Begin
          ModuleEntry.dwSize := SizeOf(ModuleEntry32);

          If Module32First(hModuleSnap, ModuleEntry) = True Then
          Begin
            sPathProgram := (ModuleEntry.szExePath);
            For i := 1 To Length(sPathProgram) Do
            Begin
              If sPathProgram[i] = '\' Then j := i;
            End;
            If UpperCase(Copy(sPathProgram, j + 1, Length(sPathProgram))) = UpperCase(sProgramName) Then k := k + 1;
          End;

          CloseHandle(hModuleSnap);
        End;

      End;
    End;
    CloseHandle(hProcessSnap);
  End;

  Result := k;

end;
mein programm läuft gerade auf einem testrechner und bis jetzt kam die zugriffsverletzung nicht mehr =)
vielen dank nochmal für eure hilfe!!!

DeddyH 10. Mär 2011 13:36

AW: Zugriffsverletzung beim Ermitteln von Prozessen
 
Prüfe bitte niemals auf true.
Delphi-Quellcode:
If Module32First(hModuleSnap, ModuleEntry) Then
Das ist nicht nur kürzer, sondern auch sicherer.

Andidreas 10. Mär 2011 13:51

AW: Zugriffsverletzung beim Ermitteln von Prozessen
 
ok... hab das auch noch angepasst ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:34 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