レジストリキーの列挙

そろそろASIOの初期化を修正しようと思います。
CLSIDを直指定だと、いつまでたってもテストコードをパッケージに追加できないのです。

ASIOのドライバを検索するためには、レジストリのHKEY_LOCAL_MACHINE\SOFTWARE\ASIO配下のキーを列挙する必要があります。
列挙といえば反復子です。registry_key_iteratorを考えてみます。
レジストリキーを列挙する関数はこれです。

LONG RegEnumKeyEx(
  HKEY hKey,                  // 列挙するべきキーのハンドル
  DWORD dwIndex,              // サブキーのインデックス番号
  LPTSTR lpName,              // サブキー名が格納されるバッファ
  LPDWORD lpcName,            // サブキー名バッファのサイズ
  LPDWORD lpReserved,         // 予約済み
  LPTSTR lpClass,             // クラス名が格納されるバッファ
  LPDWORD lpcClass,           // クラス文字列バッファのサイズ
  PFILETIME lpftLastWriteTime // 最終書き込み時刻
);

幸い、コールバック関数方式ではないので、スレッドを使う必要はありません。
この関数ではdwIndexを0から1ずつ増やしながら呼び出します。
ERROR_NO_MORE_ITEMSが返されたら列挙終了です。
インデックスでアクセスできるため、RandomAccess Iteratorにしたいところですが、id:y-hamigaki:20060517 と同じ問題から、Input Iteratorにします。
MSDNをざっと読む限り、列挙の順序は規定していないようなので、逆順で列挙する必要も、ランダムアクセスする必要もないと思います。
ただ、MSDNに逆順列挙の方法が載っているのが気になります、、、。