// TVProfile.cpp : Implementation of CTVProfile #include "stdafx.h" #include "Tvprof.h" #include "TVProfile.h" typedef TCHAR IPADDR_TSTR[4*4]; TCHAR gc_tszPathTVProfile[] = _TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\TVPlayer"); TCHAR gc_tszIPSinkAddress[] = _TEXT("IPSinkAddress"); TCHAR gc_tszAudioDestination[] = _TEXT("AudioDestination"); ///////////////////////////////////////////////////////////////////////////// // CTVProfile STDMETHODIMP CTVProfile::get_IPSinkAddress(BSTR *pVal) { if (NULL == pVal) return E_POINTER; HRESULT hr = S_OK; HKEY hKey = NULL; LONG lRes; // TODO: Once we expand the list of environment variables, write a function // ReadMachineProfile that reads and caches all HKLM variables at once, and // call it from here if not already called. // Open key lRes = RegCreateKeyEx(HKEY_LOCAL_MACHINE, gc_tszPathTVProfile, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hKey, NULL ); if ((lRes != ERROR_SUCCESS) || (hKey == NULL)) return E_FAIL; IPADDR_TSTR tszData; DWORD cbData; DWORD dwType; cbData = sizeof(IPADDR_TSTR); lRes = RegQueryValueExA(hKey, gc_tszIPSinkAddress, NULL, &dwType, (LPBYTE)tszData, &cbData); RegCloseKey(hKey); if (lRes != ERROR_SUCCESS) { return E_FAIL; } if (dwType != REG_SZ) { // Registry is messed up. Value of IPStringAddress is not a string. return E_FAIL; } #ifdef UNICODE *pVal = SysAllocString(tszData); if (NULL == *pVal) { return E_OUTOFMEMORY; } #else *pVal = SysAllocStringLen(NULL, cbData); // length of string == cbData if (NULL == *pVal) { return E_OUTOFMEMORY; } int cConverted = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, tszData, cbData, *pVal, cbData); if (0 == cConverted) { return HRESULT_FROM_WIN32(GetLastError()); } #endif return S_OK; } //****************************************************************************************** STDMETHODIMP CTVProfile::get_AudioDestination(long *pVal) { if (NULL == pVal) return E_POINTER; HRESULT hr = S_OK; HKEY hKey = NULL; LONG lRes; // Open key lRes = RegCreateKeyEx(HKEY_LOCAL_MACHINE, gc_tszPathTVProfile, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hKey, NULL ); if ((lRes != ERROR_SUCCESS) || (hKey == NULL)) return E_FAIL; DWORD dwAudioDestination; DWORD cbData; DWORD dwType; cbData = sizeof(DWORD); lRes = RegQueryValueEx(hKey, gc_tszAudioDestination, NULL, &dwType, (LPBYTE)&dwAudioDestination, &cbData); RegCloseKey(hKey); if (lRes != ERROR_SUCCESS) { return E_FAIL; } if (dwType != REG_DWORD) { // Registry is messed up. Value of AudioDestination is not a dword return E_FAIL; } *pVal = (long)dwAudioDestination; return S_OK; }