Compare commits

..

2 Commits

Author SHA1 Message Date
9136c74309 Win: Add nspace, boundary_descriptor
Some checks failed
CodeQL / Analyze (cpp) (push) Has been cancelled
Doxygen Action / build (push) Has been cancelled
Signed-off-by: Simon Rozman <simon@rozman.si>
2025-08-04 11:20:56 +02:00
75c5630dbc Common: Require explicit handle validation
Some checks failed
CodeQL / Analyze (cpp) (push) Has been cancelled
Doxygen Action / build (push) Has been cancelled
Using operator bool() hid ambiguity when handle was polymorfic with
bool. Using operator!() reqired !! to test for validity which results in
awkward code.

Signed-off-by: Simon Rozman <simon@rozman.si>
2025-07-08 11:15:54 +02:00
3 changed files with 68 additions and 2 deletions

View File

@@ -125,7 +125,7 @@ namespace winstd
if (this != std::addressof(h)) { if (this != std::addressof(h)) {
if (m_h != invalid) if (m_h != invalid)
free_internal(); free_internal();
if (h) if (h.valid())
duplicate_internal(h); duplicate_internal(h);
else else
m_h = invalid; m_h = invalid;

View File

@@ -1665,7 +1665,7 @@ namespace winstd
}; };
sa = SafeArrayCreate(VT_VARIANT, _countof(dim), dim); sa = SafeArrayCreate(VT_VARIANT, _countof(dim), dim);
} }
if (!sa) if (!sa.valid())
throw std::bad_alloc(); throw std::bad_alloc();
assert(SafeArrayGetElemsize(sa) == sizeof(VARIANT)); assert(SafeArrayGetElemsize(sa) == sizeof(VARIANT));

View File

@@ -1985,6 +1985,72 @@ namespace winstd
} }
}; };
///
/// Namespace handle wrapper
///
/// \sa [CreatePrivateNamespace function](https://learn.microsoft.com/en-us/windows/win32/api/namespaceapi/nf-namespaceapi-createprivatenamespacew)
///
class nspace : public handle<HANDLE, NULL>
{
WINSTD_HANDLE_IMPL(nspace, HANDLE, NULL)
public:
///
/// Closes an open namespace handle.
///
/// \sa [ClosePrivateNamespace function](https://learn.microsoft.com/en-us/windows/win32/api/namespaceapi/nf-namespaceapi-closeprivatenamespace)
///
virtual ~nspace()
{
if (m_h != invalid)
free_internal();
}
protected:
///
/// Closes an open namespace handle.
///
/// \sa [ClosePrivateNamespace function](https://learn.microsoft.com/en-us/windows/win32/api/namespaceapi/nf-namespaceapi-closeprivatenamespace)
///
void free_internal() noexcept override
{
ClosePrivateNamespace(m_h, 0);
}
};
///
/// Boundary descriptor handle wrapper
///
/// \sa [CreateBoundaryDescriptor function](https://learn.microsoft.com/en-us/windows/win32/api/namespaceapi/nf-namespaceapi-createboundarydescriptorw)
///
class boundary_descriptor : public handle<HANDLE, NULL>
{
WINSTD_HANDLE_IMPL(boundary_descriptor, HANDLE, NULL)
public:
///
/// Deletes the specified boundary descriptor.
///
/// \sa [DeleteBoundaryDescriptor function](https://learn.microsoft.com/en-us/windows/win32/api/namespaceapi/nf-namespaceapi-deleteboundarydescriptor)
///
virtual ~boundary_descriptor()
{
if (m_h != invalid)
free_internal();
}
protected:
///
/// Deletes the specified boundary descriptor.
///
/// \sa [DeleteBoundaryDescriptor function](https://learn.microsoft.com/en-us/windows/win32/api/namespaceapi/nf-namespaceapi-deleteboundarydescriptor)
///
void free_internal() noexcept override
{
DeleteBoundaryDescriptor(m_h);
}
};
/// @} /// @}
/// \addtogroup WinStdExceptions /// \addtogroup WinStdExceptions