mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-29 04:35:41 +08:00
[FS9] Handle CoInitializeEx being previously called with different flags
This commit is contained in:
committed by
Mat Sutcliffe
parent
50e82c26c6
commit
e68693a35e
@@ -46,7 +46,7 @@ namespace BlackSimPlugin
|
|||||||
}
|
}
|
||||||
|
|
||||||
SafeRelease(m_deviceAddress);
|
SafeRelease(m_deviceAddress);
|
||||||
CoUninitialize();
|
if (m_coInitializeSucceeded) { CoUninitialize(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CDirectPlayPeer::directPlayMessageHandler(DWORD messageId, void *msgBuffer)
|
HRESULT CDirectPlayPeer::directPlayMessageHandler(DWORD messageId, void *msgBuffer)
|
||||||
@@ -160,10 +160,29 @@ namespace BlackSimPlugin
|
|||||||
|
|
||||||
HRESULT CDirectPlayPeer::initDirectPlay()
|
HRESULT CDirectPlayPeer::initDirectPlay()
|
||||||
{
|
{
|
||||||
HRESULT hr = S_OK;
|
// Initialize COM.
|
||||||
|
// https://docs.microsoft.com/en-us/windows/desktop/api/combaseapi/nf-combaseapi-coinitializeex
|
||||||
|
HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
|
||||||
|
|
||||||
// Init COM so we can use CoCreateInstance
|
// RPC_E_CHANGED_MODE: CoInitializeEx was already called by someone else in this thread with a different mode.
|
||||||
CoInitializeEx(nullptr, COINIT_MULTITHREADED);
|
if (hr == RPC_E_CHANGED_MODE)
|
||||||
|
{
|
||||||
|
CLogMessage(this).debug(u"CoInitializeEx was already called with a different mode. Trying again.");
|
||||||
|
hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Continue here only if CoInitializeEx was successful
|
||||||
|
// S_OK: The COM library was initialized successfully on this thread.
|
||||||
|
// S_FALSE: The COM library is already initialized on this thread. Reference count was incremented. This is not an error.
|
||||||
|
if (hr == S_OK || hr == S_FALSE)
|
||||||
|
{
|
||||||
|
m_coInitializeSucceeded = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CLogMessage(this).warning(u"CoInitializeEx returned error code %1");
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
// Create the IDirectPlay8Peer Object
|
// Create the IDirectPlay8Peer Object
|
||||||
if (FAILED(hr = CoCreateInstance(CLSID_DirectPlay8Peer,
|
if (FAILED(hr = CoCreateInstance(CLSID_DirectPlay8Peer,
|
||||||
|
|||||||
@@ -92,6 +92,9 @@ namespace BlackSimPlugin
|
|||||||
|
|
||||||
using TCallbackWrapper = CallbackWrapper<CDirectPlayPeer, HRESULT, DWORD, void *>; //!< DirectPlay peer message handler wrapper
|
using TCallbackWrapper = CallbackWrapper<CDirectPlayPeer, HRESULT, DWORD, void *>; //!< DirectPlay peer message handler wrapper
|
||||||
TCallbackWrapper m_callbackWrapper; //!< Callback wrapper
|
TCallbackWrapper m_callbackWrapper; //!< Callback wrapper
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_coInitializeSucceeded = false;
|
||||||
};
|
};
|
||||||
} // ns
|
} // ns
|
||||||
} // ns
|
} // ns
|
||||||
|
|||||||
Reference in New Issue
Block a user