Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблема с Thread32First, вот код... вроед все должно быть норм.


Chorniy ©   (2008-02-27 09:58:00) 

пытаюсь получить список процессов и потоков системы, при этом процессы (закоментированный участок) выводятся правильно, а вызов функции Thread32First завершается False, и GetLastError выдает ошибку

{ The program issued a command but the command length is incorrect. }
 ERROR_BAD_LENGTH = 24;
 {$EXTERNALSYM ERROR_BAD_LENGTH}

мол, длина команды неверная? ))))) как так?

вот код:

procedure TForm1.Button18Click(Sender: TObject);
var HTHSnapShot: THandle;
   Info: TProcessEntry32;
   InfoTh: TThreadEntry32;
   Err: DWord;
begin
 Err := 0;
 ListBox2.Clear;
 HTHSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
 if HTHSnapShot = INVALID_HANDLE_VALUE then
 begin
   ShowMessage('Create snapshot error');
   Exit;
 end;
 // Process32First(HTHSnapShot, Info);
 //ListBox2.Items.Add('Pr: ' + IntToStr(Info.th32ProcessID));
 //while Process32Next(HTHSnapShot, Info) do
 //  ListBox2.Items.Add('Pr: ' + IntToStr(Info.th32ProcessID));
 if Thread32First(HTHSnapShot, InfoTh) then
   ListBox2.Items.Add('Th: ' + IntToStr(InfoTh.th32ThreadID))
 else begin
   Err := GetLastError;
   if Err <> 0 then ShowMessage('Ошибка №' + IntToStr(Err));
   Exit;
 end;
 while Thread32Next(HTHSnapShot, InfoTh) do
   ListBox2.Items.Add('Th: ' + IntToStr(Info.th32ProcessID));
end;


Chorniy   (2008-02-27 12:17:00) [1]

тьфу блин... стыдно :^( на расшифровку полей не посмотрел..тока на размер.

всем спасибо!


Riply   (2008-02-27 12:16:00) [2]

> [4] Chorniy   (27.02.08 12:07)
> Подскажите, где я могу ошибаться...

В нежелании или лени почитать Help, где все написано.

Могу еще добавить, что за собой надо убирать.
Про это тоже должно быть написано в Help-е.


Сергей М.   (2008-02-27 12:08:00) [3]


> где я могу ошибаться


Members

dwSize

Specifies the length, in bytes, of the structure. Before calling the Thread32First function, set this member to
sizeof(THREADENTRY32).


Chorniy   (2008-02-27 12:07:00) [4]

Дак данный Record описан в [2] и имеет размер 28 байт, размер фиксированный... это видно из структуры, да и функция SizeOf(TThreadEntry32) возвращает теже 28 байт.

Подскажите, где я могу ошибаться... коли функция продолжает выдавать
'длина выданной программой команды слишком велика'


Riply   (2008-02-27 10:58:00) [5]

> [2] Chorniy   (27.02.08 10:37)
> SysErorMessage(GetLastError) = длина выданной программой команды слишком велика)))

А инициализировать размер структуры перед вызовом кто будет ?


Chorniy   (2008-02-27 10:37:00) [6]

SysErorMessage(GetLastError) = длина выданной программой команды слишком велика)))

а в длину команды входят аргументы? я использую специально созданную для этой функции структуру. как при этом длина команды может быть слишком велика?

type
{$EXTERNALSYM tagTHREADENTRY32}
 tagTHREADENTRY32 = record
   dwSize: DWORD;
   cntUsage: DWORD;
   th32ThreadID: DWORD;       // this thread
   th32OwnerProcessID: DWORD; // Process this thread is associated with
   tpBasePri: Longint;
   tpDeltaPri: Longint;
   dwFlags: DWORD;
 end;
{$EXTERNALSYM THREADENTRY32}
 THREADENTRY32 = tagTHREADENTRY32;
{$EXTERNALSYM PTHREADENTRY32}
 PTHREADENTRY32 = ^tagTHREADENTRY32;
{$EXTERNALSYM LPTHREADENTRY32}
 LPTHREADENTRY32 = ^tagTHREADENTRY32;
 TThreadEntry32 = tagTHREADENTRY32;


Сергей М.   (2008-02-27 10:28:00) [7]

SysErorMessage(GetLastError) = ???


Наверх

Титульная страница Поиск, карта сайта Написать письмо