Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.23;
Скачать: CL | DM;

Вниз

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

 
Chorniy   (2008-02-27 09:58) [0]

пытаюсь получить список процессов и потоков системы, при этом процессы (закоментированный участок) выводятся правильно, а вызов функции 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;


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

SysErorMessage(GetLastError) = ???


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

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;


 
Riply ©   (2008-02-27 10:58) [3]

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

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


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

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

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


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


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


Members

dwSize

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


 
Riply ©   (2008-02-27 12:16) [6]

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

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

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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2008.03.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
2-1203981931
AlexGTI
2008-02-26 02:25
2008.03.23
Окна


3-1193851478
MM_ASH
2007-10-31 20:24
2008.03.23
StoredProc Source


15-1202789867
Slider007
2008-02-12 07:17
2008.03.23
С днем рождения ! 12 февраля 2008 вторник


15-1202726594
Циркуль
2008-02-11 13:43
2008.03.23
Сохранение документа в PDF


2-1203580401
aleyna
2008-02-21 10:53
2008.03.23
паралельно