7

値によってのみ渡されるハンドルのラッパー クラスを作成するのは、比較的簡単です。アドレスで渡す必要があるハンドルをカプセル化する最善の方法を判断しようとしています。

たとえば、値によってQueryServiceConfig()に渡されるSC_HANDLEのようなもののラッパーを作成することは、それほど難しくありません。.GetHandle()のようなメンバー関数を実装するか、operator()を実装できます。

(少なくとも私にとって) 問題は、 HKEY のアドレスを必要とする RegOpenKeyEx() のようなAPI関数です

オーバーロード演算子 & は一般的に悪い考えだと読みました。API関数へのアクセスを許可しながら、カプセル化(または可能な限り多く)、特にリソースコレクションを維持するための推奨される方法は何ですか?

4

1 に答える 1

3

間接化の別のレイヤーをいつでも追加してoperator&、醜いAttachorのひどいオーバーロードを回避し、Detachそこから事前にラップされたインスタンスを返すことができます。

VS2010 または gcc で C++0x を使用できる場合、または にアクセスする他の方法があるstd::unique_ptr<>場合は、これを行うことができます (簡潔にするためにエラー チェックは省略されています)。

struct hkey_deleter
{
    void operator()(HKEY hkey)
    {
        ::RegCloseKey(hkey);
    }
};

typedef std::unique_ptr<HKEY__, hkey_deleter> regkey;

regkey MyRegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired)
{
    HKEY hOpenedKey = NULL;
    ::RegOpenKeyEx(hKey, lpSubKey, ulOptions, samDesired, &hOpenedKey);

    return regkey(hOpenedKey);
}

void SomewhereElse()
{
    ...
    regkey r = MyRegOpenKeyEx(HKEY_CLASSES_ROOT, nullptr, 0, KEY_READ);
    ...
}

これにより、スコープが終了または呼び出さhkey_deleterれたときに、レジストリ キーが確実に閉じられます。regkey::reset()

于 2011-04-20T23:44:12.807 に答える