#pragma once #include "YYCCInternal.hpp" #if YYCC_OS == YYCC_OS_WINDOWS #include #include "WinImportPrefix.hpp" #include #include #include "WinImportSuffix.hpp" /** * @brief Windows COM related types and checker. * @details * This namespace is Windows specific. * In other platforms, this whole namespace will be unavailable. * * See also \ref com_helper. */ namespace YYCC::COMHelper { /// @brief C++ standard deleter for every COM interfaces inheriting IUnknown. class ComPtrDeleter { public: ComPtrDeleter() {} void operator() (IUnknown* com_ptr) { if (com_ptr != nullptr) { com_ptr->Release(); } } }; /// @brief Smart unique pointer of \c IFileDialog using SmartIFileDialog = std::unique_ptr; /// @brief Smart unique pointer of \c IFileOpenDialog using SmartIFileOpenDialog = std::unique_ptr; /// @brief Smart unique pointer of \c IShellItem using SmartIShellItem = std::unique_ptr; /// @brief Smart unique pointer of \c IShellItemArray using SmartIShellItemArray = std::unique_ptr; /// @brief Smart unique pointer of \c IShellFolder using SmartIShellFolder = std::unique_ptr; /// @brief C++ standard deleter for almost raw pointer used in COM which need to be free by CoTaskMemFree() class CoTaskMemDeleter { public: CoTaskMemDeleter() {} void operator() (void* com_ptr) { if (com_ptr != nullptr) { CoTaskMemFree(com_ptr); } } }; /// @brief Smart unique pointer of COM created \c WCHAR sequence. using SmartLPWSTR = std::unique_ptr, CoTaskMemDeleter>; /** * @brief Check whether COM environment has been initialized. * @return True if it is, otherwise false. * @remarks * This function will call corresponding function of COM Guard. * Do not remove this function and you must preserve at least one reference to this function in final program. * Some compiler will try to drop COM Guard in final program if no reference to it and it will cause the initialization of COM environment failed. * This is the reason why I order you do the things said above. */ bool IsInitialized(); } #endif