procedure TForm1.Button1Click(Sender: TObject); function EnumWindowsProc(const AWnd: HWND; const AParam: LPARAM): BOOL; stdcall; var Wnd: HWND; begin Wnd := HWND(AParam); if AWnd = Wnd then Result := True else Result := False; end; var Wnd: HWND; begin Wnd := Handle; EnumWindows(@EnumWindowsProc, LPARAM(Wnd)); end;
Ответ будет (автоматически) опубликован через две недели.
Читать далее: бонус-задачка специально для _Rouse.
функция перечисления должна быть вынесена из области видимости класса?
ОтветитьУдалить1. использование промежуточной переменной ну нужно (она все равно будет выкинута оптимизатором)
ОтветитьУдалить2. практически гарантированно на первой же проверке выполнение EnumWindowsProc завершится по результату False
Больше вроде заковык нет.
Т.е. вообще можно написать вот так:
Удалитьprocedure TForm1.Button1Click(Sender: TObject);
function EnumWindowsProc(const AWnd: HWND; const AParam: LPARAM): BOOL; stdcall;
begin
Result := AWnd = HWND(AParam);
end;
begin
EnumWindows(@EnumWindowsProc, LPARAM(Handle));
end;
А этот код чистый.
А модификатор const не попортит картину?
УдалитьНе должен (иначе я вообще перстану все понимать :).
УдалитьНакатал анализ твоей задачки: http://alexander-bagel.blogspot.ru/2015/04/18-gunsmoker.html
Будет смешно если ошибка даже не там где я смотрел :)
Где-то я когда-то читал, что const передаётся по значению, если значение до 4х байт. Но не знаю, как оно ведёт себя в x64.. не привычно видеть его тут.
УдалитьНу если в 64 битах оно идет со ссылке (с учетом что PTR лезет в регистр что там что там) - то видимо это нюанс.
УдалитьЯ просто щас не могу на триалке ХЕ8 собрать 64 битный проект - почему-то требует у меня какой-то дебаг сервер запущенный на 64211 порту. Завтра на работе проверю.
В принципе это реально первая здравая мысль, с учетом первой части вопроса :)
проверил, const не влияет на асм код, что в 64 битах что в 32
УдалитьВсе разобрался CONST не при чем, дело именно в 64 битах и в том что EnumWindowsProc находится внутри TForm1.Button1Clic (параметры AWnd и AParam приходят не верно :)
УдалитьЗа информацию по const - спасибо :)
УдалитьА то у меня 64х битная винда только на виртуалке, и компилятор 64х битный я не ставил (пока) принципиально.
Незачто.
УдалитьЯ, кстати, дополнил статью об анализе задачи (причины - следствия) ругательства по первому варианту кода и концовку разбора второго со стороны реверса.
Думаю, пока полный ответ не опубликован (а думаю он будет в три строчки :), можно ознакомиться
http://alexander-bagel.blogspot.ru/2015/04/18-gunsmoker.html