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

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

AV в API callback


RWolf ©   (2011-02-16 12:08:00) 

Что не так в нижеприведённом коде?

procedure EnumerateWindows(const sl: TStrings);
 function EnumWindowProc(Handle: THandle; lParam: integer): BOOL; stdcall;
 var
   nread: DWORD;
   buf: array[1..256] of Char;
   wt: string;
 begin
   result := True;
   nread := GetWindowText(Handle, @buf, 256);
   if nread <> 0 then begin
     SetLength(wt, nread);
     move(buf[1], wt[1], nread);
     sl.Add(wt);
   end;
 end;
begin
 sl.Clear;
 EnumWindows(@EnumWindowProc, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 EnumerateWindows(memo1.Lines);
end;


---------------------------
'Access violation at address 004504CE in module 'Project1.exe'. Read of address 000000A0'.
---------------------------


RWolf   (2011-02-16 12:55:00) [1]


> DiamondShark ©   (16.02.11 12:52) [2]

нормально; это я не подумал, что стек сдвинется.
Передача контекста (т.е. sl) через параметр EnumWindows'а помогла.


DiamondShark   (2011-02-16 12:52:00) [2]

Вложенную функцию как колбэк передавать?
Свежо.


clickmaker   (2011-02-16 12:14:00) [3]

nread := GetWindowTextLength(Handle);
SetLength(wt, nread);
GetWindowText(Handle, PChar(wt), nread);


Наверх

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