-
guest (30.10.12 17:47) [0]вот код, который ищет нужное окошко и выставляет флаг. проблема в том, что почему-то выставленный в кол бек функции AnalyzeWnd флаг WndFound, не поднимается "снаружи" - как так?function IsMyWindow: Boolean;
var
WndFound: Boolean;
rslt: boolean;
function AnalyzeWnd(CurHandle: THandle; CurrentProcessId: LParam): Boolean; stdcall;
var
WndProcId: Cardinal;
Buffer : array[0..255] of Char;
begin
Result := True;
GetWindowThreadProcessId(CurHandle, WndProcId);
if LParam(WndProcId) = CurrentProcessId then
begin
FillChar(Buffer, 256, 0);
GetClassName(CurHandle, @Buffer[0], 255);
WriteLog('wnd search: ' + Buffer);
if (Buffer = 'MyWindow') then
begin
WriteLog('MyWindow found');
WndFound := True;
WriteLog('WndFound = ' + BoolToStr(WndFound, True));
//stop Enum
Result := False;
end;
end;
end;
begin
WndFound := False;
rslt := EnumWindows(@AnalyzeWnd, GetCurrentProcessId);
WriteLog('done, WndFound = ' + BoolToStr(WndFound, True) + ' EnumRslt = ' + BoolToStr(rslt, True));
Result := WndFound;
end;
в итоге имею такой результат:
wnd search: MyWindow
MyWindow found
WndFound = True
done, WndFound = False EnumRslt = False
как такое объяснить??? -
bems © (30.10.12 19:11) [1]вложенную функцию нельзя использовать как коллбек, потому что у неё есть неявный параметр и сигнатура на самом деле не совпадает.
Вынеси коллбек наружу, и для общения с ним используй структуру, указатель на которую передавай в EnumWindows -
guest (30.10.12 20:01) [2]ясно, спасибо!
-
~AQUARIUS~ (01.11.12 16:32) [3]
> вложенную функцию нельзя использовать как коллбек, потому
> что у неё есть неявный параметр и сигнатура на самом деле
> не совпадает.
Нету там никакого неявного параметра, не вводите людей в заблуждение :-) Вложенные функции нельзя делать колбеками, потому что они обращаются к переменным охватывающей функции по смещениям. Локальные переменные размещаются на стеке, поэтому если такой колбек будет вызван из другой функции и попытается обратится к таким переменным - он испортит стек -
bems © (02.11.12 07:15) [4]
> Нету там никакого неявного параметра, не вводите людей в
> заблуждение :-) Вложенные функции нельзя делать колбеками,
> потому что они обращаются к переменным охватывающей функции
> по смещениям
Они обращаются к переменным охватывающей функции по смещениям относительно кадра стека охватывающей функции. Адрес кадра кладется на стек при вызове, его я и назвал неявным параметром.