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) : CDirectInputSystem::CDirectInputSystem(bool useRawInput, bool useXInput, bool enableFFeedback) :
CInputSystem(ConstructName(useRawInput, useXInput, enableFFeedback)), CInputSystem(ConstructName(useRawInput, useXInput, enableFFeedback)),
m_useRawInput(useRawInput), m_useXInput(useXInput), m_enableFFeedback(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_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) m_xiGetCapabilitiesPtr(NULL), m_xiGetStatePtr(NULL), m_xiSetStatePtr(NULL), m_di8(NULL), m_di8Keyboard(NULL), m_di8Mouse(NULL)
{ {
@ -333,7 +333,8 @@ CDirectInputSystem::~CDirectInputSystem()
{ {
m_di8->Release(); m_di8->Release();
m_di8 = NULL; m_di8 = NULL;
CoUninitialize(); if (m_initializedCOM)
CoUninitialize();
} }
} }
@ -1422,17 +1423,24 @@ bool CDirectInputSystem::InitializeSystem()
// Dynamically create DirectInput8 via COM, rather than statically linking to dinput8.dll // Dynamically create DirectInput8 via COM, rather than statically linking to dinput8.dll
// TODO - if fails, try older versions of DirectInput // TODO - if fails, try older versions of DirectInput
HRESULT hr; HRESULT hr;
if (FAILED(hr = CoInitialize(NULL))) if (SUCCEEDED(hr = CoInitialize(NULL)))
m_initializedCOM = true;
else
{ {
ErrorLog("Unable to initialize COM (error %d).\n", hr); // 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; return false;
}
} }
if (FAILED(hr = CoCreateInstance(CLSID_DirectInput8, NULL, CLSCTX_INPROC_SERVER, IID_IDirectInput8A, (LPVOID*)&m_di8))) 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); ErrorLog("Unable to initialize DirectInput API (error %d) - is DirectX 8 or later installed?\n", hr);
CoUninitialize(); if (m_initializedCOM)
CoUninitialize();
return false; return false;
} }
if (FAILED(hr = m_di8->Initialize(GetModuleHandle(NULL), DIRECTINPUT_VERSION))) if (FAILED(hr = m_di8->Initialize(GetModuleHandle(NULL), DIRECTINPUT_VERSION)))
@ -1441,7 +1449,8 @@ bool CDirectInputSystem::InitializeSystem()
m_di8->Release(); m_di8->Release();
m_di8 = NULL; m_di8 = NULL;
CoUninitialize(); if (m_initializedCOM)
CoUninitialize();
return false; return false;
} }
@ -1622,7 +1631,7 @@ bool CDirectInputSystem::ProcessForceFeedbackCmd(int joyNum, int axisNum, ForceF
// See if command is to stop all force feedback // See if command is to stop all force feedback
if (ffCmd.id == -1) if (ffCmd.id == -1)
return SUCCEEDED(hr = joystick->SendForceFeedbackCommand(DISFFC_STOPALL)); return SUCCEEDED(hr = joystick->SendForceFeedbackCommand(DISFFC_STOPALL));
// Create effect for given axis if has not already been created // Create effect for given axis if has not already been created
int effNum = (int)ffCmd.id; int effNum = (int)ffCmd.id;
LPDIRECTINPUTEFFECT *pEffect = &pInfo->dInputEffects[axisNum][effNum]; LPDIRECTINPUTEFFECT *pEffect = &pInfo->dInputEffects[axisNum][effNum];

View file

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