Конференция "WinAPI" » функция возвращает пути к процессам, себя находит два раза
 
  • tippa (05.01.11 13:26) [0]
    Вот функция, возвращающая пути к запущенным процессам:
    function exefindall(str:string):string;
    var H,H2:cardinal;
       info:PROCESSENTRY32;
       info2:MODULEENTRY32;
       bm:boolean;
       buf:string;
    begin
    result:='';
    H:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if H=0 then exit;
    info.dwSize := sizeof(TPROCESSENTRY32);
    if Process32First(H,info) then
       repeat
         H2:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,info.th32ProcessID);
         if H2=0 then exit;
         info2.dwSize := sizeof(TMODULEENTRY32);

         bm:=Module32First(H2,info2);
         while bm do
           begin
             buf:=info2.szExePath;
             if copy(buf,length(buf)-2,3)='exe' then result:=result+buf+#13#10;
             bm:=Module32Next(H2,info2);
           end;

         CloseHandle(H2);

       until not Process32Next(H,info);
    CloseHandle(H);
    end;


    почему свой процесс ('auto.exe') записывается 2 раза, в первую и последнюю строку
    C:\Program Files\Borland\Delphi7\Projects\auto\auto.exe
    C:\WINDOWS\system32\WLTRAY.exe
    C:\WINDOWS\system32\ctfmon.exe
    C:\Program Files\ICQ7.2\ICQ.exe
    C:\Program Files\EmEditor\emedtray.exe
    C:\Program Files\Telstra Turbo Connection Manager\Telstra Turbo Connection Manager.exe
    C:\Program Files\Opera\opera.exe
    C:\Program Files\Borland\Delphi7\Bin\delphi32.exe
    C:\WINDOWS\system32\taskmgr.exe
    C:\Program Files\Borland\Delphi7\Projects\auto\auto.exe

  • sniknik © (05.01.11 14:51) [1]
    из под ide? а почему бы и нет?
  • Игорь Шевченко © (05.01.11 15:25) [2]
    А зачем ты два раза snapshot делаешь ?
  • tippa (05.01.11 16:09) [3]

    > из под ide? а почему бы и нет?

    и так и так


    > А зачем ты два раза snapshot делаешь ?

    вот здесь высмотрел _http://www.sql.ru/forum/actualthread.aspx?bid=20&tid=114705&hl=

    задача - получить список путей для запущенных процессов, буду признателен если подскажите другой вариант
  • sniknik © (05.01.11 16:51) [4]
    > буду признателен если подскажите другой вариант
    в JEDI делается немного по другому, наверное не спроста
    procedure BuildModulesList;
     type
       TProcessData = packed record
         UsageCnt: Word;
         RelocateCnt: Word;
       end;
     var
       ML: TStringList;
       SnapProcHandle, SnapModuleHandle: THandle;
       ProcessEntry: TProcessEntry32;
       ModuleEntry: TModuleEntry32;
       ProcessNext, ModuleNext: Boolean;
       I: Integer;
       PD: TProcessData;
     begin
       ML := TStringList.Create;
       Screen.Cursor := crHourGlass;
       try
         ML.Sorted := True;
         ML.Duplicates := dupIgnore;

         SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
         if SnapProcHandle <> THandle(-1) then
         begin
           ProcessEntry.dwSize := Sizeof(ProcessEntry);
           ProcessNext := Process32First(SnapProcHandle, ProcessEntry);
           while ProcessNext do
           begin
             SnapModuleHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessEntry.th32ProcessID);
             if SnapModuleHandle <> THandle(-1) then
             begin
               ModuleEntry.dwSize := Sizeof(ModuleEntry);
               ModuleNext := Module32First(SnapModuleHandle, ModuleEntry);
               while ModuleNext do
               begin
                 I := ML.Add(ModuleEntry.szExePath);
                 PD := TProcessData(ML.Objects[I]);
                 Inc(PD.UsageCnt);
                 if GetImageBase(ModuleEntry.szExePath) <> DWORD(ModuleEntry.modBaseAddr) then
                   Inc(PD.RelocateCnt);
                 ML.Objects[I] := Pointer(PD);
                 ModuleNext := Module32Next(SnapModuleHandle, ModuleEntry);
               end;
               CloseHandle(SnapModuleHandle);
             end;
             ProcessNext := Process32Next(SnapProcHandle, ProcessEntry);
           end;
           CloseHandle(SnapProcHandle);
         end;

         with ModulesListView do
         begin
           Items.BeginUpdate;
           Items.Clear;
           for I := 0 to ML.Count - 1 do
             with Items.Add do
             begin
               Caption := AnsiLowerCase(ExtractFileName(ML[I]));
               PD := TProcessData(ML.Objects[I]);
               if PD.RelocateCnt = 0 then
                 ImageIndex := 20
               else
                 ImageIndex := 19;
               with SubItems do
               begin
                 Add(IntToStr(PD.UsageCnt));
                 if PD.RelocateCnt = 0 then Add('-') else Add(IntToStr(PD.RelocateCnt));
                 Add(ML[I]);
               end;
             end;
            AlphaSort;
            Items.EndUpdate;
         end;

         with StatusBar do
         begin
           Panels.BeginUpdate;
           Panels[0].Text := Format(sModulesCount, [ML.Count]);
           Panels.EndUpdate;
         end;

       finally
         ML.Free;
         Screen.Cursor := crDefault;
       end;
     end;

 
Конференция "WinAPI" » функция возвращает пути к процессам, себя находит два раза
Есть новые Нет новых   [134431   +11][b:0][p:0.003]