Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26069
Рейтинг: 2121
#256: 2011-05-16 12:11:22 ЛС | профиль | цитата
goluzov писал(а):
вот этот код работает на win xp 64

А показывает x64 процессы
------------ Дoбавленo в 12.11:
Попробуй вот это -- enumprocess_007.rar
карма: 22

0
файлы: 1enumprocess_007.rar [5.4KB] [182]
Ответов: 245
Рейтинг: 3
#257: 2011-05-16 12:32:11 ЛС | профиль | цитата
показывает только 32 битные процессы
------------ Дoбавленo в 12.32:
nesco писал(а):
А показывает x64 процессы


да. они там все 64
карма: 0

0
Разработчик
Ответов: 26069
Рейтинг: 2121
#258: 2011-05-16 12:41:25 ЛС | профиль | цитата
goluzov писал(а):
показывает только 32 битные процессы

Так работает последний код, который тут выложили
------------ Дoбавленo в 12.39:
Так что я засомневался в правильноси вот этого утверждени
goluzov писал(а):
вот этот код работает на win xp 64

Может код и работает, но показывать он будет только 32-х битные процессы. Надо рыть дальше
------------ Дoбавленo в 12.41:
goluzov, если ты проверишь этот компонент на всех осях, то он везде будет показывать только 32-х битные процессы
карма: 22

0
Ответов: 245
Рейтинг: 3
#259: 2011-05-16 13:07:12 ЛС | профиль | цитата
xp64
2003x64
EnumProcess007

карма: 0

0
Разработчик
Ответов: 26069
Рейтинг: 2121
#260: 2011-05-17 00:35:34 ЛС | профиль | цитата
goluzov, вот почему я говорю, что очень сложно, когда у меня нет этих систем. Исправление компонента превращается в тупое слепое тыкание. Я нашел альтернативный вариант, пока говорить не буду, на чем и как он построен, но предполагает определение всего на любой системе. И опять все это виртуально, не имея всей базы для проверки
------------ Дoбавленo в 16.15:
goluzov, проверь вот этот код на всех системах



Add(MainForm,2953706,77,147)
{
link(onCreate,3394494:doEvent1,[])
}
Add(InlineCode,2850697,189,161)
{
WorkPoints=#13:doEnumProcess|
EventPoints=#13:onEnumProcess|
VarPoints=#14:CountProcesses|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|5:type |36: PPerfDataBlock = ^TPerfDataBlock; |26: TPerfDataBlock = record |37: Signature: array[0..3] of WCHAR; |25: LittleEndian: DWORD; |20: Version: DWORD; |21: Revision: DWORD; |28: TotalByteLength: DWORD; |25: HeaderLength: DWORD; |27: NumObjectTypes: DWORD; |28: DefaultObject: Longint; |29: SystemTime: TSystemTime; |29: PerfTime: TLargeInteger; |29: PerfFreq: TLargeInteger; |36: PerfTime100nSec: TLargeInteger; |29: SystemNameLength: DWORD; |29: SystemNameOffset: DWORD; |7: end; |0:|38: PPerfObjectType = ^TPerfObjectType; |27: TPerfObjectType = record |28: TotalByteLength: DWORD; |29: DefinitionLength: DWORD; |25: HeaderLength: DWORD; |33: ObjectNameTitleIndex: DWORD; |29: ObjectNameTitle: LPWSTR; |33: ObjectHelpTitleIndex: DWORD; |29: ObjectHelpTitle: LPWSTR; |24: DetailLevel: DWORD; |24: NumCounters: DWORD; |29: DefaultCounter: Longint; |27: NumInstances: Longint; |21: CodePage: DWORD; |29: PerfTime: TLargeInteger; |29: PerfFreq: TLargeInteger; |7: end; |0:|52: PPerfCounterDefinition = ^TPerfCounterDefinition; |34: TPerfCounterDefinition = record |23: ByteLength: DWORD; |34: CounterNameTitleIndex: DWORD; |30: CounterNameTitle: LPWSTR; |34: CounterHelpTitleIndex: DWORD; |30: CounterHelpTitle: LPWSTR; |27: DefaultScale: Longint; |24: DetailLevel: DWORD; |24: CounterType: DWORD; |24: CounterSize: DWORD; |26: CounterOffset: DWORD; |7: end; |0:|54: PPerfInstanceDefinition = ^TPerfInstanceDefinition; |35: TPerfInstanceDefinition = record |23: ByteLength: DWORD; |35: ParentObjectTitleIndex: DWORD; |33: ParentObjectInstance: DWORD; |23: UniqueID: Longint; |23: NameOffset: DWORD; |23: NameLength: DWORD; |7: end; |0:|42: PPerfCounterBlock = ^TPerfCounterBlock; |29: TPerfCounterBlock = record |23: ByteLength: DWORD; |6: end;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|30: FCountProcesses: integer;|9: public|30: onEnumProcess: THI_Event;|58: procedure doEnumProcess(var _Data:TData; Index:word);|64: procedure CountProcesses(var _Data:TData; Index:word); |5: end;|0:|14:implementation|0:|36:procedure THiAsmClass.doEnumProcess;|5:const|56: INCREMENTAL_SIZE = 32768; // Шаг увеличения буфера|58: INITIAL_BUFFER_SIZE = 65536; // Начальный размер буфера|57: PROCESS_OBJECT_INDEX = 230; // Индекс объекта Process|67: PID_OBJECT_INDEX = 784; // Индекс счетчика ID Process (PID)|3:var|41: buflen: DWORD; // текущий размер буфера|46: PerfData: PPerfDataBlock; // PERF_DATA_BLOCK|47: PerfObj: PPerfObjectType; // PERF_OBJECT_TYPE|72: PerfCntr, CurCntr: PPerfCounterDefinition; // PERF_COUNTER_DEFINITION|65: PerfInst: PPerfInstanceDefinition; // PERF_INSTANCE_DEFINITION|68: PerfCntrBlk, PtrToCntr: PPerfCounterBlock; // PERF_COUNTER_BLOCK|38: i,k,j: Integer; // счетчики в циклах|42: process_name: String; // выходная строка|55: pData: PLargeInteger; // Указатель на данные счетчика|5:begin|23: FCountProcesses := 0;|32: buflen := INITIAL_BUFFER_SIZE;|55: GetMem(PerfData, buflen); // Выделяем начальный буфер|5: try|39: // Пытаемся заполнить буфер данными|86: while RegQueryValueEx(HKEY_PERFORMANCE_DATA, PChar(Int2Str(PROCESS_OBJECT_INDEX)),|82: nil,nil,Pointer(PerfData), @buflen) = ERROR_MORE_DATA do|71: begin // Если буфер маленький, то увеличиваем его и снова пытаемся|35: inc(buflen,INCREMENTAL_SIZE);|35: ReallocMem(PerfData, buflen);|8: end;|75: RegCloseKey(HKEY_PERFORMANCE_DATA); // Обязательно закрываем этот ключ.|80: // Получаем указатель на первую структуру PERF_OBJECT_TYPE (первый инфоблок)|72: PerfObj := PPerfObjectType(DWORD(PerfData) + PerfData.HeaderLength);|46: // Перебираем все полученные типы объектов|48: for i := 0 to PerfData.NumObjectTypes - 1 do|9: begin|41: // Ищем объект Process (индекс 230)|65: if PerfObj.ObjectNameTitleIndex = PROCESS_OBJECT_INDEX then|11: begin|77: // Запоминаем расположение описаний счетчиков PERF_COUNTER_DEFINITION|82: PerfCntr := PPerfCounterDefinition(DWORD(PerfObj) + PerfObj.HeaderLength);|61: // Получаем экземпляры объекта Process, если они есть|40: if PerfObj.NumInstances > 0 then|13: begin|76: // Получаем указатель на первую структуру PERF_INSTANCE_DEFINITION|89: PerfInst := PPerfInstanceDefinition(DWORD(PerfObj) + PerfObj.DefinitionLength);|46: // Перебираем все экземпляры объекта|51: for k := 0 to PerfObj.NumInstances - 1 do|15: begin|62: // Получаем имя текущего экземпляра (имя процесса)|95: process_name := WideCharToString(PWideChar(DWORD(PerfInst) + PerfInst.NameOffset));|68: // Если имя равно '_Total', то пропускаем этот экземпляр|59: // т.к. это суммарные данные для всех процессов|53: if process_name = '_Total' then Continue;|75: // Получаем указатель на первый счетчик PERF_COUNTER_DEFINITION|32: CurCntr := PerfCntr;|73: // Получаем указатель на данные счетчиков текущего экземпляра|33: // PERF_COUNTER_BLOCK|82: PtrToCntr := PPerfCounterBlock(DWORD(PerfInst) + PerfInst.ByteLength);|57: //Перебираем все счетчики для каждого объекта|52: for j := 0 to PerfObj.NumCounters - 1 do|17: begin|54: // Получаем указатель на данные счетчика|73: pData := Pointer(DWORD(PtrToCntr) + CurCntr.CounterOffset);|91: // Если счетчик - это ID Process, то читаем его и добавляем в выходную строку|70: if CurCntr.CounterNameTitleIndex = PID_OBJECT_INDEX then|19: begin|78: process_name := process_name + ';' + Int2Str(Integer(pData^));|37: inc(FCountProcesses);|18: end;|56: // Получаем указатель на следующий счетчик|86: CurCntr := PPerfCounterDefinition(DWORD(CurCntr) + CurCntr.ByteLength); |18: end; |54: // Добавляем выходную строку в TStringList|53: _hi_onEvent(onEnumProcess, process_name);|64: // Получаем указатель на следующий экземпляр объекта|64: // Он находится сразу за данными текущего экземпляра|84: PerfCntrBlk := PPerfCounterBlock(DWORD(PerfInst) + PerfInst.ByteLength);|93: PerfInst := PPerfInstanceDefinition(DWORD(PerfCntrBlk) + PerfCntrBlk.ByteLength);|14: end;|12: end;|10: end;|52: // Получаем указатель на следующий тип объекта|75: PerfObj := PPerfObjectType(DWORD(PerfObj) + PerfObj.TotalByteLength);|8: end;|9: finally|57: // В любом случае освобождаем память, занятую буфером|22: FreeMem(PerfData);|6: end;|6:end; |0:|37:procedure THiAsmClass.CountProcesses;|5:begin|36: dtInteger(_Data, FCountProcesses);|4:end;|0:|4:end.|
link(onEnumProcess,1548553:doAdd,[])
}
Add(StringTable,1548553,245,161)
{
Width=384
Height=262
Align=5
Columns=#16:Name Process=250|7:PID=100|
}
Add(StatusBar,5638070,245,217)
{
}
Add(Hub,3394494,133,161)
{
link(onEvent1,2850697:doEnumProcess,[])
link(onEvent2,4324632:doStrCat,[(165,174)(165,223)])
}
Add(StrCat,4324632,182,217)
{
Str1="Processes : "
link(onStrCat,5638070:doText,[])
link(Str2,2850697:CountProcesses,[])
}

------------ Дoбавленo в 00.35:
Во млин. Куда-то бетатестер исчез
карма: 22

0
Ответов: 245
Рейтинг: 3
#261: 2011-05-17 01:46:43 ЛС | профиль | цитата
щас на винXP 64 работает
карма: 0

0
Разработчик
Ответов: 26069
Рейтинг: 2121
#262: 2011-05-17 01:49:27 ЛС | профиль | цитата
goluzov писал(а):
щас на винXP 64 работает

А на остальных
карма: 22

0
Ответов: 245
Рейтинг: 3
#263: 2011-05-17 01:53:19 ЛС | профиль | цитата
на вин2000 работает, на винME нет
------------ Дoбавленo в 01.52:
vista 32/64 работает
------------ Дoбавленo в 01.53:
win7 x64 тоже работает
карма: 0

0
Разработчик
Ответов: 26069
Рейтинг: 2121
#264: 2011-05-17 01:54:46 ЛС | профиль | цитата
goluzov писал(а):
на винME нет

Я же сказал, что последняя версия компонента будет поддерживать только линейку NT, тк Win98 и WinMe сняты с производства и обслуживания разработчиками, почему мы должны ее поддерживать

Вот тебе для теста последний релиз компонента, протестируй и отпишись. И больше про Win98 не отписывайся


карма: 22

0
файлы: 1enumprocess_007.zip [6.9KB] [136]
Ответов: 245
Рейтинг: 3
#265: 2011-05-17 01:55:01 ЛС | профиль | цитата
xp 32 win7 32 работает
карма: 0

0
Разработчик
Ответов: 26069
Рейтинг: 2121
#266: 2011-05-17 01:56:42 ЛС | профиль | цитата
goluzov, сервера, как на серверах себя ведет
------------ Дoбавленo в 01.55:
Жду ответа по компоненту
------------ Дoбавленo в 01.56:
На тебе простенькую схемку, тестируй по ней



Add(MainForm,2953706,77,147)
{
Width=600
Height=331
link(onCreate,3394494:doEvent1,[])
}
Add(StringTable,1548553,469,168)
{
Width=533
Height=273
Align=5
Columns=#11:Process=200|6:PID=60|11:ParentID=60|12:PathName=240|
ColumnClick=1
Point(doSort)
Point(onColumnClick)
link(onColumnClick,1548553:doSort,[(513,181)(513,195)(457,195)(457,209)])
}
Add(StatusBar,5638070,469,245)
{
link(Text,1548553:Count,[])
}
Add(Hub,3394494,133,161)
{
InCount=2
OutCount=3
link(onEvent1,1548553:doClear,[(231,167)(231,181)])
link(onEvent2,9279657:doEnum,[])
link(onEvent3,5638070:doText,[(165,181)(165,251)])
}
Add(EnumProcess,9279657,182,168)
{
DebugPrivilege=0
Name="HiAsm.exe"
Point(onFind)
Point(doFindName)
link(onProcess,11996582:doValue,[])
}
Add(Button,10116902,77,196)
{
Top=273
Width=533
Align=4
TabOrder=-1
Caption="Refresh"
link(onClick,3394494:doEvent2,[(121,202)(121,174)])
}
Add(FormatStr,3724857,392,168)
{
DataCount=4
Mask="%1;%2;%3;%4"
link(onFString,1548553:doAdd,[])
link(Str2,9279657:CurrentID,[(405,156)(275,156)(275,212)(188,212)])
link(Str3,9279657:CurrParentID,[(412,156)(282,156)(282,212)(195,212)])
link(Str4,11996582:Value,[(419,156)(359,156)(359,212)(300,212)])
}
Add(Memory,11996582,294,168)
{
link(onData,14776842:doPart,[])
}
Add(FilePartElm,14776842,343,168)
{
link(onPart,3724857:doString,[])
}

карма: 22

0
Ответов: 245
Рейтинг: 3
#267: 2011-05-17 02:11:37 ЛС | профиль | цитата
на серверах работает.

nesco писал(а):
На тебе простенькую схемку, тестируй по ней


winXP 64
карма: 0

0
Разработчик
Ответов: 26069
Рейтинг: 2121
#268: 2011-05-17 02:23:32 ЛС | профиль | цитата
И что будем делать Полный путь на x64 получить не удается

Засвети список процессов, что выдает предыдущий пример в WinXP x64
------------ Дoбавленo в 02.23:
Хорошо, а вот такой релиз работает с моим последним примером, засвети список. Путей быть не должно


карма: 22

0
файлы: 1enumprocess_008.zip [6.9KB] [185]
Ответов: 245
Рейтинг: 3
#269: 2011-05-17 02:24:01 ЛС | профиль | цитата
winXP 64
карма: 0

0
Разработчик
Ответов: 26069
Рейтинг: 2121
#270: 2011-05-17 02:24:47 ЛС | профиль | цитата
Отлично, теперь последний релиз на последней схеме
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)