BOOL RegisterHelper(LPCTSTR* rglpszRegister, LPCTSTR* rglpszSymbols, BOOL bReplace) { ASSERT(rglpszRegister != NULL); ASSERT(rglpszSymbols != NULL); CString strKey; CString strValueName; CString strValue; // keeping a key open makes this go a bit faster CKey keyTemp; VERIFY(keyTemp.Create(HKEY_CLASSES_ROOT, _T("CLSID"))); BOOL bResult = TRUE; while (*rglpszRegister != NULL) { LPCTSTR lpszKey = *rglpszRegister++; if (*lpszKey == '\0') continue; LPCTSTR lpszValueName = lpszKey + lstrlen(lpszKey) + 1; LPCTSTR lpszValue = lpszValueName + lstrlen(lpszValueName) + 1; strKey.ReleaseBuffer( FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, lpszKey, NULL, NULL, strKey.GetBuffer(256), 256, (va_list*) rglpszSymbols)); strValueName = lpszValueName; strValue.ReleaseBuffer( FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, lpszValue, NULL, NULL, strValue.GetBuffer(256), 256, (va_list*) rglpszSymbols)); if (strKey.IsEmpty()) { TRACE1("Warning: skipping empty key '%s'.\n", lpszKey); continue; } CKey key; VERIFY(key.Create(HKEY_CLASSES_ROOT, strKey)); if (!bReplace) { CString str; if (key.GetStringValue(str, strValueName) && !str.IsEmpty()) continue; } if (!key.SetStringValue(strValue, strValueName)) { TRACE2("Error: failed setting key '%s' to value '%s'.\n", (LPCTSTR)strKey, (LPCTSTR)strValue); bResult = FALSE; break; } } return bResult; }