最近、 SOでRAIIに関する一般的な質問を投稿しました。ただし、HANDLEの例にはまだいくつかの実装上の問題があります。
AHANDLE
はでtypedeffedさvoid *
れwindows.h
ます。したがって、正しいshared_ptr
定義は次のようになります。
std::tr1::shared_ptr<void> myHandle (INVALID_HANDLE_VALUE, CloseHandle);
例1 CreateToolhelp32Snapshot
:戻りHANDLE
、動作します。
const std::tr1::shared_ptr<void> h
(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL), CloseHandle);
定義で使用void
しているように(正しい方法は何ですか?)、このポインターを使用してさらにいくつかのwinapiコマンドを呼び出そうとすると、問題が発生します。それらは機能的には機能しますが、醜いので、より良い解決策が必要だと確信しています。
次の例でh
は、は上部の定義を介して作成されたポインタです。
例2 OpenProcessToken
:最後の引数はPHANDLE
。キャストで中程度の醜い。
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
(PHANDLE)&h);
例3 Process32First
:最初の引数はHANDLE
。本当に醜い。
Process32First(*((PHANDLE)&h), &pEntry);
例4定数との簡単な比較HANDLE
。本当に醜い。
if (*((PHANDLE)&h) == INVALID_HANDLE) { /* do something */ }
HANDLEに適切なshared_ptrを作成する正しい方法は何ですか?