Наследование интерфейса IDirectInputA

Тема в разделе "LANGS.C", создана пользователем float, 8 ноя 2010.

  1. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    В общем хочу написать свои реализации методов динпута. Но при создании объекта, непонятно каким образом вызывается CorExitProcess.
    Код (Text):
    1. class xDirectInputA :
    2.     public IDirectInputA
    3. {
    4. public:
    5.  
    6.     xDirectInputA(IDirectInputA* di) : m_di(di)
    7.     {
    8.     }
    9.  
    10.     HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObj)
    11.     {
    12.         return m_di->QueryInterface(riid, ppvObj);
    13.     }
    14.  
    15.     ULONG STDMETHODCALLTYPE AddRef()
    16.     {
    17.         return m_di->AddRef();
    18.     }
    19.  
    20.     ULONG STDMETHODCALLTYPE Release()
    21.     {
    22.         ULONG count = m_di->Release();
    23.         if(0 == count)
    24.             delete this;
    25.  
    26.         return count;
    27.     }
    28.  
    29.     STDMETHOD(CreateDevice)(REFGUID rguid, IDirectInputDeviceA** device, LPUNKNOWN unknown)
    30.     {
    31.         HRESULT hr = m_di->CreateDevice(rguid, device, unknown);
    32.         return hr;
    33.     }
    34.  
    35.     STDMETHOD(EnumDevices)(DWORD devType,LPDIENUMDEVICESCALLBACKA callback, LPVOID ref, DWORD flags)
    36.     {
    37.         return m_di->EnumDevices(devType, callback, ref, flags);
    38.     }
    39.  
    40.     STDMETHOD(GetDeviceStatus)(REFGUID rguid)
    41.     {
    42.         return m_di->GetDeviceStatus(rguid);
    43.     }
    44.  
    45.     STDMETHOD(RunControlPanel)(HWND owner, DWORD flags)
    46.     {
    47.         return m_di->RunControlPanel(owner, flags);
    48.     }
    49.  
    50.     STDMETHOD(Initialize)(HINSTANCE instance, DWORD version)
    51.     {
    52.         return m_di->Initialize(instance, version);
    53.     }
    54.  
    55. private:
    56.     IDirectInputA* m_di;
    57. };
    58.  
    59.  
    60. .................
    61.  
    62. xDirectInputA xDI = new xDirectInputA((IDirectInputA*)(*ppDI));
    как так?
     
  2. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    дебаггер уже пробовал?
     
  3. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    я отладчиком не смог понять, там куча непонятных коллов, ооп же. В самом конце, без всяких условий, вызывается CorExitProcess. И все это внутри
    Код (Text):
    1. xDirectInputA xDI = new xDirectInputA();
     
  4. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    Кое что разобрал. Вызывается просто ExitProcess, но перед этим идет сравнение по какому-то статическому адресу с нулем, и на этом все срывается.
    [​IMG]
    Был бы адрес, передаваемый в функцию - было бы яснее.
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Зачем наследоваться от IDirectInputA?
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Приведите код целиком, у меня данный кусок работает нормально. Скорее всего проблема в передаваемом параметре. И ещё, зачем xDirectInputA xDI = new, а не xDirectInputA *pxDI = new?
     
  7. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    Код (Text):
    1. HRESULT WINAPI xDirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, IDirectInputA** ppDI, LPUNKNOWN punkOuter)
    2. {
    3.     HRESULT hr = _DirectInputCreateA(hinst, dwVersion, ppDI, punkOuter);
    4.  
    5.     xDirectInputA xDI = new xDirectInputA((IDirectInputA*)(*ppDI));
    6.    
    7.     return hr;
    8. }