![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблема с 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) = ???