From b08273b12768185771bc3c4b173f32ffc4308f91 Mon Sep 17 00:00:00 2001 From: oltolm Date: Sun, 23 Feb 2025 14:39:39 +0100 Subject: [PATCH] Use Microsoft::WRL::ComPtr (#16744) --- rpcs3/Emu/Audio/XAudio2/XAudio2Backend.cpp | 8 +++--- .../Emu/Audio/XAudio2/xaudio2_enumerator.cpp | 6 ++--- rpcs3/Emu/CMakeLists.txt | 5 ---- rpcs3/Input/xinput_pad_handler.cpp | 25 ++++++------------- rpcs3/Input/xinput_pad_handler.h | 14 +++++------ rpcs3/rpcs3qt/shortcut_utils.cpp | 11 ++++---- rpcs3/util/dyn_lib.cpp | 14 ++++++++--- rpcs3/util/dyn_lib.hpp | 19 +++++--------- 8 files changed, 44 insertions(+), 58 deletions(-) diff --git a/rpcs3/Emu/Audio/XAudio2/XAudio2Backend.cpp b/rpcs3/Emu/Audio/XAudio2/XAudio2Backend.cpp index 3931638c69..0a84d747bf 100644 --- a/rpcs3/Emu/Audio/XAudio2/XAudio2Backend.cpp +++ b/rpcs3/Emu/Audio/XAudio2/XAudio2Backend.cpp @@ -65,7 +65,7 @@ XAudio2Backend::XAudio2Backend() m_com_init_success = true; } - if (HRESULT hr = XAudio2Create(instance.GetAddressOf(), 0, XAUDIO2_USE_DEFAULT_PROCESSOR); FAILED(hr)) + if (HRESULT hr = XAudio2Create(&instance, 0, XAUDIO2_USE_DEFAULT_PROCESSOR); FAILED(hr)) { XAudio.error("XAudio2Create() failed: %s (0x%08x)", std::system_category().message(hr), static_cast(hr)); return; @@ -78,7 +78,7 @@ XAudio2Backend::XAudio2Backend() } // Try to register a listener for device changes - if (HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(enumerator.GetAddressOf())); FAILED(hr)) + if (HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&enumerator)); FAILED(hr)) { XAudio.error("CoCreateInstance() failed: %s (0x%08x)", std::system_category().message(hr), static_cast(hr)); return; @@ -215,7 +215,7 @@ bool XAudio2Backend::Open(std::string_view dev_id, AudioFreq freq, AudioSampleSi if (use_default_device) { Microsoft::WRL::ComPtr default_dev{}; - if (HRESULT hr = m_device_enumerator->GetDefaultAudioEndpoint(eRender, eConsole, default_dev.GetAddressOf()); FAILED(hr)) + if (HRESULT hr = m_device_enumerator->GetDefaultAudioEndpoint(eRender, eConsole, &default_dev); FAILED(hr)) { XAudio.error("GetDefaultAudioEndpoint() failed: %s (0x%08x)", std::system_category().message(hr), static_cast(hr)); return false; @@ -319,7 +319,7 @@ f64 XAudio2Backend::GetCallbackFrameLen() Microsoft::WRL::ComPtr xaudio_ext{}; f64 min_latency{}; - if (HRESULT hr = m_xaudio2_instance->QueryInterface(IID_IXAudio2Extension, std::bit_cast(xaudio_ext.GetAddressOf())); FAILED(hr)) + if (HRESULT hr = m_xaudio2_instance.As(&xaudio_ext); FAILED(hr)) { XAudio.error("QueryInterface() failed: %s (0x%08x)", std::system_category().message(hr), static_cast(hr)); } diff --git a/rpcs3/Emu/Audio/XAudio2/xaudio2_enumerator.cpp b/rpcs3/Emu/Audio/XAudio2/xaudio2_enumerator.cpp index 5f1fd1f44c..0655f29dca 100644 --- a/rpcs3/Emu/Audio/XAudio2/xaudio2_enumerator.cpp +++ b/rpcs3/Emu/Audio/XAudio2/xaudio2_enumerator.cpp @@ -26,7 +26,7 @@ xaudio2_enumerator::~xaudio2_enumerator() std::vector xaudio2_enumerator::get_output_devices() { Microsoft::WRL::ComPtr devEnum{}; - if (HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(devEnum.GetAddressOf())); FAILED(hr)) + if (HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&devEnum)); FAILED(hr)) { xaudio_dev_enum.error("CoCreateInstance() failed: %s (0x%08x)", std::system_category().message(hr), static_cast(hr)); return {}; @@ -57,7 +57,7 @@ std::vector xaudio2_enumerator::get_outpu for (UINT dev_idx = 0; dev_idx < count; dev_idx++) { Microsoft::WRL::ComPtr endpoint{}; - if (HRESULT hr = devices->Item(dev_idx, endpoint.GetAddressOf()); FAILED(hr)) + if (HRESULT hr = devices->Item(dev_idx, &endpoint); FAILED(hr)) { xaudio_dev_enum.error("devices->Item() failed: %s (0x%08x)", std::system_category().message(hr), static_cast(hr)); continue; @@ -83,7 +83,7 @@ std::vector xaudio2_enumerator::get_outpu CoTaskMemFree(id); Microsoft::WRL::ComPtr props{}; - if (HRESULT hr = endpoint->OpenPropertyStore(STGM_READ, props.GetAddressOf()); FAILED(hr)) + if (HRESULT hr = endpoint->OpenPropertyStore(STGM_READ, &props); FAILED(hr)) { xaudio_dev_enum.error("endpoint->OpenPropertyStore() failed: %s (0x%08x)", std::system_category().message(hr), static_cast(hr)); continue; diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index cd4cdb2a46..d3ad281643 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -627,11 +627,6 @@ if(TARGET 3rdparty_vulkan) RSX/VK/VKVertexProgram.cpp RSX/VK/VKTextureCache.cpp ) - if(MSVC) - set_source_files_properties(RSX/VK/vkutils/shared.cpp PROPERTIES - COMPILE_FLAGS /EHs- - SKIP_PRECOMPILE_HEADERS ON) - endif() endif() target_link_libraries(rpcs3_emu diff --git a/rpcs3/Input/xinput_pad_handler.cpp b/rpcs3/Input/xinput_pad_handler.cpp index 49c2467faf..f23cb7fd79 100644 --- a/rpcs3/Input/xinput_pad_handler.cpp +++ b/rpcs3/Input/xinput_pad_handler.cpp @@ -3,6 +3,7 @@ #include "stdafx.h" #include "xinput_pad_handler.h" #include "Emu/Io/pad_config.h" +#include "util/dyn_lib.hpp" namespace XINPUT_INFO { @@ -77,8 +78,6 @@ xinput_pad_handler::~xinput_pad_handler() { if (library) { - FreeLibrary(library); - library = nullptr; xinputGetExtended = nullptr; xinputGetCustomData = nullptr; xinputGetState = nullptr; @@ -374,12 +373,6 @@ pad_preview_values xinput_pad_handler::get_preview_values(const std::unordered_m }; } -template -T getProc(HMODULE hModule, LPCSTR lpProcName) -{ - return reinterpret_cast(GetProcAddress(hModule, lpProcName)); -} - bool xinput_pad_handler::Init() { if (m_is_init) @@ -387,17 +380,17 @@ bool xinput_pad_handler::Init() for (auto it : XINPUT_INFO::LIBRARY_FILENAMES) { - library = LoadLibrary(it); + library.load(it); if (library) { - xinputGetExtended = getProc(library, "XInputGetExtended"); // Optional - xinputGetCustomData = getProc(library, "XInputGetCustomData"); // Optional - xinputGetState = getProc(library, reinterpret_cast(100)); + xinputGetExtended = library.get("XInputGetExtended"); // Optional + xinputGetCustomData = library.get("XInputGetCustomData"); // Optional + xinputGetState = library.get(reinterpret_cast(100)); if (!xinputGetState) - xinputGetState = getProc(library, "XInputGetState"); + xinputGetState = library.get("XInputGetState"); - xinputSetState = getProc(library, "XInputSetState"); - xinputGetBatteryInformation = getProc(library, "XInputGetBatteryInformation"); + xinputSetState = library.get("XInputSetState"); + xinputGetBatteryInformation = library.get("XInputGetBatteryInformation"); if (xinputGetState && xinputSetState && xinputGetBatteryInformation) { @@ -405,8 +398,6 @@ bool xinput_pad_handler::Init() break; } - FreeLibrary(library); - library = nullptr; xinputGetExtended = nullptr; xinputGetCustomData = nullptr; xinputGetState = nullptr; diff --git a/rpcs3/Input/xinput_pad_handler.h b/rpcs3/Input/xinput_pad_handler.h index 2ca25bd336..899e649b13 100644 --- a/rpcs3/Input/xinput_pad_handler.h +++ b/rpcs3/Input/xinput_pad_handler.h @@ -1,6 +1,7 @@ #pragma once #include "Emu/Io/PadHandler.h" +#include "util/dyn_lib.hpp" #include @@ -9,7 +10,6 @@ #endif #include #include -#include // ScpToolkit defined structure for pressure sensitive button query struct SCP_EXTN @@ -116,22 +116,22 @@ public: void init_config(cfg_pad* cfg) override; private: - typedef DWORD (WINAPI * PFN_XINPUTGETEXTENDED)(DWORD, SCP_EXTN *); - typedef DWORD (WINAPI * PFN_XINPUTGETCUSTOMDATA)(DWORD, DWORD, void *); - typedef DWORD (WINAPI * PFN_XINPUTGETSTATE)(DWORD, XINPUT_STATE *); - typedef DWORD (WINAPI * PFN_XINPUTSETSTATE)(DWORD, XINPUT_VIBRATION *); - typedef DWORD (WINAPI * PFN_XINPUTGETBATTERYINFORMATION)(DWORD, BYTE, XINPUT_BATTERY_INFORMATION *); + using PFN_XINPUTGETEXTENDED = DWORD(WINAPI*)(DWORD, SCP_EXTN*); + using PFN_XINPUTGETCUSTOMDATA = DWORD(WINAPI*)(DWORD, DWORD, void*); + using PFN_XINPUTGETSTATE = DWORD(WINAPI*)(DWORD, XINPUT_STATE*); + using PFN_XINPUTSETSTATE = DWORD(WINAPI*)(DWORD, XINPUT_VIBRATION*); + using PFN_XINPUTGETBATTERYINFORMATION = DWORD(WINAPI*)(DWORD, BYTE, XINPUT_BATTERY_INFORMATION*); int GetDeviceNumber(const std::string& padId); static PadButtonValues get_button_values_base(const XINPUT_STATE& state, trigger_recognition_mode trigger_mode); static PadButtonValues get_button_values_scp(const SCP_EXTN& state, trigger_recognition_mode trigger_mode); - HMODULE library{ nullptr }; PFN_XINPUTGETEXTENDED xinputGetExtended{ nullptr }; PFN_XINPUTGETCUSTOMDATA xinputGetCustomData{ nullptr }; PFN_XINPUTGETSTATE xinputGetState{ nullptr }; PFN_XINPUTSETSTATE xinputSetState{ nullptr }; PFN_XINPUTGETBATTERYINFORMATION xinputGetBatteryInformation{ nullptr }; + utils::dynamic_library library; std::shared_ptr get_device(const std::string& device) override; bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; diff --git a/rpcs3/rpcs3qt/shortcut_utils.cpp b/rpcs3/rpcs3qt/shortcut_utils.cpp index 6c16cdff04..98f72d2872 100644 --- a/rpcs3/rpcs3qt/shortcut_utils.cpp +++ b/rpcs3/rpcs3qt/shortcut_utils.cpp @@ -16,6 +16,7 @@ #include #include "Emu/system_utils.hpp" +#include #else #include #include @@ -142,19 +143,17 @@ namespace gui::utils return false; } - IShellLink* pShellLink = nullptr; - IPersistFile* pPersistFile = nullptr; + Microsoft::WRL::ComPtr pShellLink; + Microsoft::WRL::ComPtr pPersistFile; const auto cleanup = [&](bool return_value, const std::string& fail_reason) -> bool { if (!return_value) sys_log.error("Failed to create shortcut: %s", fail_reason); - if (pPersistFile) pPersistFile->Release(); - if (pShellLink) pShellLink->Release(); CoUninitialize(); return return_value; }; - res = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pShellLink)); + res = CoCreateInstance(__uuidof(ShellLink), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pShellLink)); if (FAILED(res)) return cleanup(false, "CoCreateInstance failed"); @@ -200,7 +199,7 @@ namespace gui::utils } // Use the IPersistFile object to save the shell link - res = pShellLink->QueryInterface(IID_PPV_ARGS(&pPersistFile)); + res = pShellLink.As(&pPersistFile); if (FAILED(res)) return cleanup(false, fmt::format("QueryInterface failed (%s)", str_error(res))); diff --git a/rpcs3/util/dyn_lib.cpp b/rpcs3/util/dyn_lib.cpp index d739a28c09..1177aff229 100644 --- a/rpcs3/util/dyn_lib.cpp +++ b/rpcs3/util/dyn_lib.cpp @@ -29,6 +29,14 @@ namespace utils return loaded(); } +#ifdef _WIN32 + bool dynamic_library::load(const std::wstring& path) + { + m_handle = LoadLibraryW(path.c_str()); + return loaded(); + } +#endif + void dynamic_library::close() { #ifdef _WIN32 @@ -39,12 +47,12 @@ namespace utils m_handle = nullptr; } - void* dynamic_library::get_impl(const std::string& name) const + void* dynamic_library::get_impl(const char* name) const { #ifdef _WIN32 - return reinterpret_cast(GetProcAddress(reinterpret_cast(m_handle), name.c_str())); + return reinterpret_cast(GetProcAddress(reinterpret_cast(m_handle), name)); #else - return dlsym(m_handle, name.c_str()); + return dlsym(m_handle, name); #endif } diff --git a/rpcs3/util/dyn_lib.hpp b/rpcs3/util/dyn_lib.hpp index dcd958a818..2968f8daed 100644 --- a/rpcs3/util/dyn_lib.hpp +++ b/rpcs3/util/dyn_lib.hpp @@ -31,26 +31,19 @@ namespace utils ~dynamic_library(); bool load(const std::string& path); +#ifdef _WIN32 + bool load(const std::wstring& path); +#endif void close(); private: - void* get_impl(const std::string& name) const; + void* get_impl(const char* name) const; public: template - Type* get(const std::string& name) const + Type get(const char* name) const { - Type* result; - *reinterpret_cast(&result) = get_impl(name); - return result; - } - - template - bool get(Type*& function, const std::string& name) const - { - *reinterpret_cast(&function) = get_impl(name); - - return function != nullptr; + return reinterpret_cast(get_impl(name)); } bool loaded() const;