- use std::codevct as the convertion method among UTF8, UTF16 and UTF32. - fix the issue that COM Guard was accidently dropped by compiler because no reference to it.
48 lines
1.2 KiB
C++
48 lines
1.2 KiB
C++
#include "COMHelper.hpp"
|
|
#if YYCC_OS == YYCC_OS_WINDOWS
|
|
|
|
namespace YYCC::COMHelper {
|
|
|
|
/**
|
|
* @brief The guard for initialize COM environment.
|
|
* @details This class will try initializing COM environment by calling CoInitialize when constructing,
|
|
* and it also will try uninitializing COM environment when destructing.
|
|
* If initialization failed, uninitialization will not be executed.
|
|
*/
|
|
class ComGuard {
|
|
public:
|
|
ComGuard() : m_HasInit(false) {
|
|
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
|
|
if (SUCCEEDED(hr)) m_HasInit = true;
|
|
}
|
|
~ComGuard() {
|
|
if (m_HasInit) {
|
|
CoUninitialize();
|
|
}
|
|
}
|
|
|
|
bool IsInitialized() const {
|
|
return m_HasInit;
|
|
}
|
|
|
|
protected:
|
|
bool m_HasInit;
|
|
};
|
|
|
|
/**
|
|
* @brief The instance of COM environment guard.
|
|
* @details Dialog related function need COM environment,
|
|
* so we need initializing COM environment when loading this module,
|
|
* and uninitializing COM environment when we no longer use this module.
|
|
* So we use a static instance in here.
|
|
* And make it be const so no one can change it.
|
|
*/
|
|
static const ComGuard c_ComGuard {};
|
|
|
|
bool IsInitialized() {
|
|
return c_ComGuard.IsInitialized();
|
|
}
|
|
|
|
}
|
|
|
|
#endif |