![]() |
|
#3
|
||||
|
||||
|
Yes. I have done that for Windows native RPC handles.
The problem is, we have to specify the custom deleter each time when we declare a new variable. It's tedious. Maybe a typedef or "using"? And, std::unique_ptr lacks abstraction for a default_value. Also, we can add custom conversion operator for UniqueResource to avoid explicitly using Get() method each time, just like "operator LPCSTR()", and "operator LPCWSTR()" of the ancient CString class from Microsoft. Code:
explicit operator ResourceType() const noexcept
{
return resource_;
}
samples of custom deleters for windows native RPC( "pointer" is defined for each functor): Code:
struct StringBindingDeleter {
typedef RPC_WSTR pointer;
void operator()(RPC_WSTR stringBinding) {
[[maybe_unused]] RPC_STATUS status = RpcStringFree(&stringBinding);
assert(status == RPC_S_OK);
}
};
struct RpcBindingDeleter {
typedef RPC_BINDING_HANDLE pointer;
void operator()(RPC_BINDING_HANDLE h) {
[[maybe_unused]] RPC_STATUS status = RpcBindingFree(&h);
assert(status == RPC_S_OK);
}
};
usage: Code:
RPC_WSTR stringBinding = nullptr;
status = RpcStringBindingCompose(nullptr, (RPC_WSTR)L"ncalrpc", nullptr,
(RPC_WSTR)L"9038a9dd-b0f3-4745-827e-d4109e662cea", nullptr,
(RPC_WSTR *)&stringBinding);
if (status != RPC_S_OK || !stringBinding)
return E_FAIL;
std::unique_ptr stringBindingOwner(stringBinding, StringBindingDeleter);
RPC_BINDING_HANDLE rpcBinding = nullptr;
status = RpcBindingFromStringBinding(stringBinding, &rpcBinding);
if (status != RPC_S_OK)
return E_FAIL;
std::unique_ptr rpcBindingOwner(rpcBinding, RpcBindingDeleter);
Quote:
__________________
AKA Solomon/blowfish. Last edited by WhoCares; 06-07-2024 at 22:28. |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Resource Manager (.NET) v2 | CodeCracker | Community Tools | 2 | 11-23-2025 22:25 |