Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

232 lines
4.5 KiB

#include "precomp.h"
#include "AppCollection.h"
#include "confroom.h"
#include "EnumVar.h"
//////////////////////////////////////////////////////////
// Construction/destruction/initialization
//////////////////////////////////////////////////////////
CSharableAppCollection::CSharableAppCollection()
: m_pList(NULL)
{
DBGENTRY(CSharableAppCollection::CSharableAppCollection);
DBGEXIT(CSharableAppCollection::CSharableAppCollection);
}
CSharableAppCollection::~CSharableAppCollection()
{
DBGENTRY(CSharableAppCollection::~CSharableAppCollection);
if(m_pList)
{
FreeShareableApps(m_pList);
}
DBGEXIT(CSharableAppCollection::~CSharableAppCollection);
}
//static
HRESULT CSharableAppCollection::CreateInstance(IAS_HWND_ARRAY* pList, ISharableAppCollection **ppSharebleAppCollection)
{
DBGENTRY(HRESULT CSharableAppCollection::CreateInstance);
HRESULT hr = S_OK;
if(pList)
{
CComObject<CSharableAppCollection>* p = NULL;
p = new CComObject<CSharableAppCollection>(NULL);
if(p)
{
p->SetVoid(NULL);
p->InternalFinalConstructAddRef();
hr = p->FinalConstruct();
p->InternalFinalConstructRelease();
if(hr == S_OK)
{
hr = p->QueryInterface(IID_ISharableAppCollection, reinterpret_cast<void**>(ppSharebleAppCollection));
p->m_pList = pList;
}
if(FAILED(hr))
{
delete p;
*ppSharebleAppCollection = NULL;
}
}
else
{
hr = E_OUTOFMEMORY;
}
}
else
{
hr = E_POINTER;
}
DBGEXIT(CSharableAppCollection::CreateInstance);
return hr;
}
//////////////////////////////////////////////////////////
// ISharableAppCollection
//////////////////////////////////////////////////////////
STDMETHODIMP CSharableAppCollection::get_Item(VARIANT Index, DWORD* pSharableAppHWND)
{
DBGENTRY(CSharableAppCollection::get_Item);
HRESULT hr = S_OK;
USES_CONVERSION;
if(m_pList)
{
if(pSharableAppHWND)
{
switch(Index.vt)
{
case VT_BSTR:
*pSharableAppHWND = reinterpret_cast<long>(_GetHWNDFromName(OLE2T(Index.bstrVal)));
break;
case VT_I2:
if(static_cast<UINT>(Index.iVal) < m_pList->cEntries)
{
*pSharableAppHWND = reinterpret_cast<long>(m_pList->aEntries[Index.iVal].hwnd);
}
else
{
hr = E_INVALIDARG;
}
break;
case VT_I4:
if(static_cast<UINT>(Index.lVal) < m_pList->cEntries)
{
*pSharableAppHWND = reinterpret_cast<long>(m_pList->aEntries[Index.lVal].hwnd);
}
else
{
hr = E_INVALIDARG;
}
break;
default:
hr = E_INVALIDARG;
}
}
else
{
hr = E_POINTER;
}
}
else
{
hr = E_UNEXPECTED;
}
DBGEXIT_HR(CSharableAppCollection::get_Item,hr);
return hr;
}
STDMETHODIMP CSharableAppCollection::_NewEnum(IUnknown** ppunk)
{
DBGENTRY(CSharableAppCollection::_NewEnum);
HRESULT hr = S_OK;
if(m_pList)
{
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = m_pList->cEntries;
psa = SafeArrayCreate(VT_I4, m_pList->cEntries, rgsabound);
if(psa)
{
for(UINT i = 0; i < m_pList->cEntries; ++i)
{
CComVariant var(reinterpret_cast<long>(m_pList->aEntries[i].hwnd));
long ix[1] = {i};
SafeArrayPutElement(psa, ix, &var);
}
CEnumVariant* pEnumVar = NULL;
hr = CEnumVariant::Create(psa, m_pList->cEntries, &pEnumVar);
if(SUCCEEDED(hr))
{
hr = pEnumVar->QueryInterface(IID_IEnumVARIANT, reinterpret_cast<void**>(ppunk));
}
SafeArrayDestroy(psa);
}
else
{
hr = E_OUTOFMEMORY;
}
}
DBGEXIT_HR(CSharableAppCollection::_NewEnum,hr);
return hr;
}
STDMETHODIMP CSharableAppCollection::get_Count(LONG * pnCount)
{
DBGENTRY(CSharableAppCollection::get_Count);
HRESULT hr = S_OK;
if(m_pList)
{
if(pnCount)
{
*pnCount = m_pList->cEntries;
}
else
{
hr = E_POINTER;
}
}
else
{
hr = E_UNEXPECTED;
}
DBGEXIT_HR(CSharableAppCollection::get_Count,hr);
return hr;
}
//////////////////////////////////////////////////////////
// Helper Fns
//////////////////////////////////////////////////////////
HWND CSharableAppCollection::_GetHWNDFromName(LPCTSTR pcsz)
{
HWND hWnd = NULL;
if(m_pList)
{
int cch = lstrlen(pcsz) + 1;
LPTSTR pszTmp = new TCHAR[cch];
if(pszTmp)
{
for(UINT i = 0; i < m_pList->cEntries; ++i)
{
HWND hWndCur = m_pList->aEntries[i].hwnd;
if(::GetWindowText(hWndCur , pszTmp, cch))
{
// If the window text is the same, just return the hwnd
if(!lstrcmp(pcsz, pszTmp))
{
hWnd = hWndCur;
break;
}
}
}
delete [] pszTmp;
}
}
return hWnd;
}