Конференция "WinAPI" » EnumWindows... [D7, WinXP]
 
  • 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]

    > Нету там никакого неявного параметра, не вводите людей в
    > заблуждение :-) Вложенные функции нельзя делать колбеками,
    >  потому что они обращаются к переменным охватывающей функции
    > по смещениям

    Они обращаются к переменным охватывающей функции по смещениям относительно кадра стека охватывающей функции. Адрес кадра кладется на стек при вызове, его я и назвал неявным параметром.
 
Конференция "WinAPI" » EnumWindows... [D7, WinXP]
Есть новые Нет новых   [134430   +3][b:0][p:0.001]