Added check for error that occurs when calling CoInitialize from a managed context

This commit is contained in:
Nik Henson 2011-06-27 23:06:08 +00:00
parent 7f53bd4816
commit 809892c69c
2 changed files with 18 additions and 8 deletions

View file

@ -314,7 +314,7 @@ const char *CDirectInputSystem::ConstructName(bool useRawInput, bool useXInput,
CDirectInputSystem::CDirectInputSystem(bool useRawInput, bool useXInput, bool enableFFeedback) :
CInputSystem(ConstructName(useRawInput, useXInput, enableFFeedback)),
m_useRawInput(useRawInput), m_useXInput(useXInput), m_enableFFeedback(enableFFeedback),
m_activated(false), m_hwnd(NULL), m_screenW(0), m_screenH(0),
m_initializedCOM(false), m_activated(false), m_hwnd(NULL), m_screenW(0), m_screenH(0),
m_getRIDevListPtr(NULL), m_getRIDevInfoPtr(NULL), m_regRIDevsPtr(NULL), m_getRIDataPtr(NULL),
m_xiGetCapabilitiesPtr(NULL), m_xiGetStatePtr(NULL), m_xiSetStatePtr(NULL), m_di8(NULL), m_di8Keyboard(NULL), m_di8Mouse(NULL)
{
@ -333,6 +333,7 @@ CDirectInputSystem::~CDirectInputSystem()
{
m_di8->Release();
m_di8 = NULL;
if (m_initializedCOM)
CoUninitialize();
}
}
@ -1422,16 +1423,23 @@ bool CDirectInputSystem::InitializeSystem()
// Dynamically create DirectInput8 via COM, rather than statically linking to dinput8.dll
// TODO - if fails, try older versions of DirectInput
HRESULT hr;
if (FAILED(hr = CoInitialize(NULL)))
if (SUCCEEDED(hr = CoInitialize(NULL)))
m_initializedCOM = true;
else
{
// CoInitialize fails if called from managed context (ie .NET debugger) so check for this and ignore this error
if (hr != RPC_E_CHANGED_MODE)
{
ErrorLog("Unable to initialize COM (error %d).\n", hr);
return false;
}
}
if (FAILED(hr = CoCreateInstance(CLSID_DirectInput8, NULL, CLSCTX_INPROC_SERVER, IID_IDirectInput8A, (LPVOID*)&m_di8)))
{
ErrorLog("Unable to initialize DirectInput API (error %d) - is DirectX 8 or later installed?\n", hr);
if (m_initializedCOM)
CoUninitialize();
return false;
}
@ -1441,6 +1449,7 @@ bool CDirectInputSystem::InitializeSystem()
m_di8->Release();
m_di8 = NULL;
if (m_initializedCOM)
CoUninitialize();
return false;
}

View file

@ -95,6 +95,7 @@ private:
DWORD m_screenW;
DWORD m_screenH;
bool m_initializedCOM;
bool m_activated;
// Function pointers for RawInput API