mirror of
https://github.com/QB64Official/qb64.git
synced 2024-09-19 12:05:16 +00:00
117 lines
3.8 KiB
C++
117 lines
3.8 KiB
C++
/**
|
|
* This file has no copyright assigned and is placed in the Public Domain.
|
|
* This file is part of the mingw-w64 runtime package.
|
|
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
|
|
*/
|
|
|
|
#ifndef _WRL_COREWRAPPERS_H_
|
|
#define _WRL_COREWRAPPERS_H_
|
|
|
|
#include <windows.h>
|
|
#include <intsafe.h>
|
|
#include <winstring.h>
|
|
#include <roapi.h>
|
|
|
|
/* #include <wrl/def.h> */
|
|
#include <wrl/internal.h>
|
|
|
|
namespace Microsoft {
|
|
namespace WRL {
|
|
namespace Details {
|
|
struct Dummy {};
|
|
}
|
|
|
|
namespace Wrappers {
|
|
class HStringReference {
|
|
private:
|
|
void Init(const wchar_t* str, unsigned int len) {
|
|
HRESULT hres = ::WindowsCreateStringReference(str, len, &header_, &hstr_);
|
|
if (FAILED(hres))
|
|
::Microsoft::WRL::Details::RaiseException(hres);
|
|
}
|
|
|
|
HStringReference() : hstr_(nullptr) {}
|
|
|
|
public:
|
|
HStringReference(const wchar_t* str, unsigned int len) throw() : hstr_(nullptr) {
|
|
Init(str, len);
|
|
}
|
|
|
|
template<unsigned int sizeDest>
|
|
explicit HStringReference(wchar_t const (&str)[sizeDest]) throw() : hstr_(nullptr) {
|
|
Init(str, sizeDest - 1);
|
|
}
|
|
|
|
template <size_t sizeDest>
|
|
explicit HStringReference(wchar_t (&strRef)[sizeDest]) throw() {
|
|
const wchar_t *str = static_cast<const wchar_t*>(strRef);
|
|
Init(str, ::wcslen(str));
|
|
}
|
|
|
|
template<typename T>
|
|
explicit HStringReference(const T &strRef) throw() : hstr_(nullptr) {
|
|
const wchar_t* str = static_cast<const wchar_t*>(strRef);
|
|
size_t len = ::wcslen(str);
|
|
if(static_cast<size_t>(static_cast<unsigned int>(len)) != len)
|
|
::Microsoft::WRL::Details::RaiseException(INTSAFE_E_ARITHMETIC_OVERFLOW);
|
|
Init(str, len);
|
|
}
|
|
|
|
HStringReference(const HStringReference &other) throw() : hstr_(nullptr) {
|
|
unsigned int len = 0;
|
|
const wchar_t* value = other.GetRawBuffer(&len);
|
|
Init(value, len);
|
|
}
|
|
|
|
~HStringReference() throw() {
|
|
hstr_ = nullptr;
|
|
}
|
|
|
|
HStringReference& operator=(const HStringReference &other) throw() {
|
|
unsigned int len = 0;
|
|
const wchar_t* value = other.GetRawBuffer(&len);
|
|
Init(value, len);
|
|
return *this;
|
|
}
|
|
|
|
HSTRING Get() const throw() {
|
|
return hstr_;
|
|
}
|
|
|
|
const wchar_t *GetRawBuffer(unsigned int *len) const {
|
|
return ::WindowsGetStringRawBuffer(hstr_, len);
|
|
}
|
|
|
|
HRESULT CopyTo(HSTRING *str) const throw() {
|
|
return ::WindowsDuplicateString(hstr_, str);
|
|
}
|
|
|
|
friend class HString;
|
|
|
|
protected:
|
|
HSTRING_HEADER header_;
|
|
HSTRING hstr_;
|
|
};
|
|
|
|
class RoInitializeWrapper {
|
|
public:
|
|
RoInitializeWrapper(RO_INIT_TYPE flags) {
|
|
hres = ::Windows::Foundation::Initialize(flags);
|
|
}
|
|
|
|
~RoInitializeWrapper() {
|
|
if(SUCCEEDED(hres))
|
|
::Windows::Foundation::Uninitialize();
|
|
}
|
|
|
|
operator HRESULT() {
|
|
return hres;
|
|
}
|
|
private:
|
|
HRESULT hres;
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|