Debugger Einzelschritte F11 springt nicht in funktion



  • hola leute

    folgendes problem:
    scheinbar wird ein funktionsaufruf im code nicht ausgeführt und der debugger überspringt die funktion genauso.

    das ist die funktion wo es passiert:

    auto __stdcall InitWindowProc(HWND hwnd, unsigned int msg, uint_ptr wparam, long_ptr lparam) noexcept -> long_ptr
    {
       if(msg == WM_NCCREATE || msg == WM_CREATE)
       {
          txl::gui::message m(hwnd, msg, wparam, lparam);
          interface_window_callback *wc = 
             reinterpret_cast<interface_window_callback*>(reinterpret_cast<CREATESTRUCT*>(lparam)->lpCreateParams);
    
          if(wc != nullptr)
          {
             SetPropW(hwnd, window_property_name(), reinterpret_cast<HANDLE>(wc));
             SetWindowLongPtr(hwnd, GWLP_WNDPROC, reinterpret_cast<long_ptr>(&WindowProc));
    
             wc->window_procedure(m); // das ist der funktionsaufruf der uebersprungen wird
    
             if(m.processed == true)
             {
                return m.result;
             }
          }
       }
    
       return DefWindowProcW(hwnd, msg, wparam, lparam);
    }
    

    der pointer 'wc' zeigt auf einen gueltigen speicherbereich. auf ein object das ich erstellt hatte. hab ich ueberprueft.
    ich hab auch in window_procedure einen breakpoint gesetzt. ohne erfolg.

    hier der code zu window_procedure:

    // header file:
    class __declspec(novtable) interface_window_callback
    {
       public:
          virtual auto window_procedure(txl::gui::message &m) noexcept -> void = 0;
    };
    
    class window_callback : public txl::object, public interface_window_callback
    {
       public:
          friend auto __stdcall InitWindowProc(HWND hwnd, unsigned int msg, uint_ptr wparam, long_ptr lparam) noexcept -> long_ptr;
          friend auto __stdcall WindowProc(HWND hwnd, unsigned int msg, uint_ptr wparam, long_ptr lparam) noexcept -> long_ptr;
    ...
       protected:
          virtual auto window_proc(txl::gui::message &m) noexcept -> void;
    
       private:
          virtual auto window_procedure(txl::gui::message &m) noexcept -> void override;
    ...
    };
    
    // cpp-file
    auto window_callback::window_proc(txl::gui::message & m) noexcept -> void
    {
       window_message_event_data *data = events.find(m.msg);
    
       if(data != nullptr)
       {
          (reinterpret_cast<window_message_event_data::generic_class*>(m_owner)->*(data->function))(m);
       }
    }
    
    auto window_callback::window_procedure(txl::gui::message & m) noexcept -> void
    {
       window_proc(m);
    
       if (m.processed == false)
       {
          m.result = DefWindowProcW(m.handle, m.msg, m.wparam, m.lparam);
          m.processed = true;
       }
    }
    

    woran koennte das liegen ?

    Visual Studio 2015 Community, Windows 10

    PS: die variable processed in m ist auch noch auf false gesetzt obwohl sie in window_procedure auf true gesetzt wird.

    Meep Meep



  • Schau dir das Disassembly an, da kannst sicher überall reinspringen.



  • ich hab jetzt der klasse interface_window_callback eine weitere function spendiert:

    virtual auto test(void) noexcept -> void  = 0;
    

    in window_callback sieht sie dann so aus:

    virtual auto test(void) noexcept -> void
          {
             if(m_handle.native_handle() == 0)
                MessageBoxW(0, L"handle == 0", L"Message", MB_OK);
          }
    

    die ruf ich vor window_procedure in der InitWindowProc auf. selber effekt. geht nicht rein und MessageBoxW wird nicht ausgefuehrt


Anmelden zum Antworten