LONG CKey::RecurseDeleteKey(LPCTSTR subKeyName) throw() { CKey key; LONG res = key.Open(_object, subKeyName, KEY_READ | KEY_WRITE); if (res != ERROR_SUCCESS) return res; FILETIME fileTime; const UInt32 kBufferSize = MAX_PATH + 1; // 256 in ATL DWORD size = kBufferSize; TCHAR buffer[kBufferSize]; while (RegEnumKeyEx(key._object, 0, buffer, &size, NULL, NULL, NULL, &fileTime) == ERROR_SUCCESS) { res = key.RecurseDeleteKey(buffer); if (res != ERROR_SUCCESS) return res; size = kBufferSize; } key.Close(); return DeleteSubKey(subKeyName); }
static void RegisterExt(LPCTSTR lpszExt, LPCTSTR lpszProgID, UINT nIDTypeName, LPCTSTR* rglpszSymbols, LPCTSTR* rglpszExtRegister, LPCTSTR* rglpszRegister, int nIcon) { // don't overwrite anything with the extensions CString strWhole; VERIFY(strWhole.LoadString(nIDTypeName)); CString str; AfxExtractSubString(str, strWhole, DOCTYPE_PROGID); rglpszSymbols[1] = lpszProgID; rglpszSymbols[4] = str; rglpszSymbols[6] = lpszExt; TCHAR buf[10]; wsprintf(buf, _T("%d"), nIcon); rglpszSymbols[7] = buf; // check for .ext and progid CKey key; if (!key.Open(HKEY_CLASSES_ROOT, lpszExt)) // .ext doesn't exist RegisterHelper(rglpszExtRegister, rglpszSymbols, TRUE); key.Close(); if (!key.Open(HKEY_CLASSES_ROOT, lpszProgID)) // ProgID doesn't exist (i.e. txtfile) RegisterHelper(rglpszRegister, rglpszSymbols, TRUE); }