|
@@ -148,7 +148,19 @@ WIN_RoInitialize(void)
|
|
typedef HRESULT (WINAPI *RoInitialize_t)(RO_INIT_TYPE initType);
|
|
typedef HRESULT (WINAPI *RoInitialize_t)(RO_INIT_TYPE initType);
|
|
RoInitialize_t RoInitializeFunc = (RoInitialize_t)WIN_LoadComBaseFunction("RoInitialize");
|
|
RoInitialize_t RoInitializeFunc = (RoInitialize_t)WIN_LoadComBaseFunction("RoInitialize");
|
|
if (RoInitializeFunc) {
|
|
if (RoInitializeFunc) {
|
|
- return RoInitializeFunc(RO_INIT_MULTITHREADED);
|
|
|
|
|
|
+ /* RO_INIT_SINGLETHREADED is equivalent to COINIT_APARTMENTTHREADED */
|
|
|
|
+ HRESULT hr = RoInitializeFunc(RO_INIT_SINGLETHREADED);
|
|
|
|
+ if (hr == RPC_E_CHANGED_MODE) {
|
|
|
|
+ hr = RoInitializeFunc(RO_INIT_MULTITHREADED);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* S_FALSE means success, but someone else already initialized. */
|
|
|
|
+ /* You still need to call RoUninitialize in this case! */
|
|
|
|
+ if (hr == S_FALSE) {
|
|
|
|
+ return S_OK;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return hr;
|
|
} else {
|
|
} else {
|
|
return E_NOINTERFACE;
|
|
return E_NOINTERFACE;
|
|
}
|
|
}
|