HRESULT CTCPropBagOnRegKey::_GetObjectCLSID(const _bstr_t& strName, CLSID& clsid, CRegKey& subkey, _bstr_t& strObjectID, IErrorLog* pErrorLog) { USES_CONVERSION; // Clear the specified clsid, subkey, and strObjectID parameters clsid = CLSID_NULL; subkey.Close(); strObjectID.Empty(); // Open the subkey with the specified name if (!strName.length()) subkey = m_key; else if (!m_key.Exists(strName) || !subkey.Open(m_key, strName)) return HRESULT_FROM_WIN32(GetLastError()); // Use local resources for string loading MCLibRes res; // Read the object's CLSID string value HRESULT hr; _bstr_t strDesc; if (subkey.GetString(m_szCLSID, strObjectID)) { // Convert the object's CLSID string to a CLSID LPOLESTR pszObjectID = const_cast<LPOLESTR>(T2COLE(strObjectID)); hr = CLSIDFromString(pszObjectID, &clsid); if (SUCCEEDED(hr)) return hr; // Format an error description string strDesc.Format(IDS_FMT_FAIL_CONVERT_CLSID, strObjectID); } else if (subkey.GetString(m_szProgID, strObjectID)) { // Convert the object's ProgID string to a CLSID hr = CLSIDFromProgID(T2COLE(strObjectID), &clsid); if (SUCCEEDED(hr)) return hr; // Format an error description string strDesc.Format(IDS_FMT_FAIL_CONVERT_CLSID, strObjectID); } else { // Save the last error hr = HRESULT_FROM_WIN32(GetLastError()); // Format an error description string strDesc.LoadString(IDS_FAIL_READ_CLSID); } // Log the error and return return LogError("GetObjectCLSID", strDesc, hr, T2COLE(strName), pErrorLog); }
HRESULT CTCPropBagOnRegKey::_ReadVariantFromValue(CRegKey& key, const _bstr_t& strPropName, DWORD nType, int cbData, CComVariant& v, IErrorLog* pErrorLog) { // Read the value from the registry based on the value type switch (nType) { case REG_DWORD: { key.GetDWord(strPropName, (DWORD&)V_UI4(&v)); v.vt = VT_UI4; break; } case REG_SZ: { _bstr_t strValue; key.GetString(strPropName, strValue); v = strValue; break; } case REG_BINARY: { BYTE* pData = new BYTE[cbData]; key.GetBinary(strPropName, pData, cbData); CMemFile file(pData, cbData); CArchive ar(&file, CArchive::load, 0); ar >> v; ar.Close(); delete [] file.Detach(); break; } default: { // Use local resources MCLibRes res; // Format a description string _bstr_t strDesc; strDesc.Format(IDS_FMT_UNSUPPORTED_REGTYPE, nType); // Log the error USES_CONVERSION; return LogError("ReadVariantFromValue", strDesc, E_FAIL, T2COLE(strPropName), pErrorLog); } } // Indicate success return S_OK; }