/// <summary>
/// <para name='Name'>AllocAdrList</para>
/// <para name='Purpose'>Allocate and AdrList structure</para>
/// </summary>
/// <param name='ulNumProps'>Number of properties to allocate</param>
/// <param name='lpAdrList'>[out]The returned pointer to the AdrList</param>
/// <returns>HRESULT</returns>
/// <remarks>
/// <para name='Notes'>Taken from MFCMapi's MAPIABFunctions.cpp as HrAllocAdrList</para>
/// <para name='Author'></para>
/// <para name='LastModified'></para>
/// </remarks>
STDMETHODIMP ZybraxiSoft::CMailbox::AllocAdrList(ULONG ulNumProps, LPADRLIST * lpAdrList)
{
	HRESULT hr = S_OK;
	LPADRLIST lpLocalAdrList = NULL;

	// HrAllocAdrList just nulls the out variable
	// *lpAdrList = NULL;
	// ...but I think, if it's not null, it should be freed(?)
	if (*lpAdrList)
	{
		FreePadrlist(*lpAdrList);
		*lpAdrList = NULL;
	}

	// Allocate memory for the new SRowSet structure
	if (SUCCEEDED(hr = MAPIAllocateBuffer(
		CbNewSRowSet(1),
		(LPVOID*)&lpLocalAdrList)))
	{
		// Zero out our SRowSet memory
		ZeroMemory(lpLocalAdrList, CbNewSRowSet(1));

		// Allocate the memory for the internal SPropValue
		if (SUCCEEDED(hr = MAPIAllocateBuffer(
			ulNumProps * sizeof(SPropValue),
			(LPVOID*)&lpLocalAdrList->aEntries[0].rgPropVals)))
		{
			// Zero out our SPropValue
			if (lpLocalAdrList->aEntries[0].rgPropVals)
				ZeroMemory(lpLocalAdrList->aEntries[0].rgPropVals,
					ulNumProps * sizeof(SPropValue));
		}
		else
		{
			FATAL("MAPIAllocateBuffer(SPropVal)", hr);
			FreePadrlist(lpLocalAdrList);
		}

		if (SUCCEEDED(hr))
		{
			*lpAdrList = lpLocalAdrList;
		}
		else
		{
			FreePadrlist(lpLocalAdrList);
		}
	}
	else
	{
		FATAL(_T("MAPIAllocateBuffer(SRowSet)"), hr);
	}

	return hr;
}
示例#2
0
_Check_return_ HRESULT HrAllocAdrList(ULONG ulNumProps, _Deref_out_opt_ LPADRLIST* lpAdrList)
{
	if (!lpAdrList || ulNumProps > ULONG_MAX / sizeof(SPropValue)) return MAPI_E_INVALID_PARAMETER;
	HRESULT hRes = S_OK;
	LPADRLIST lpLocalAdrList = NULL;

	*lpAdrList = NULL;

	// Allocate memory for new SRowSet structure.
	EC_H(MAPIAllocateBuffer(CbNewSRowSet(1), (LPVOID*)&lpLocalAdrList));

	if (lpLocalAdrList)
	{
		// Zero out allocated memory.
		ZeroMemory(lpLocalAdrList, CbNewSRowSet(1));

		// Allocate memory for SPropValue structure that indicates what
		// recipient properties will be set.
		EC_H(MAPIAllocateBuffer(
			ulNumProps * sizeof(SPropValue),
			(LPVOID*)&lpLocalAdrList->aEntries[0].rgPropVals));

		// Zero out allocated memory.
		if (lpLocalAdrList->aEntries[0].rgPropVals)
			ZeroMemory(lpLocalAdrList->aEntries[0].rgPropVals, ulNumProps * sizeof(SPropValue));
		if (SUCCEEDED(hRes))
		{
			*lpAdrList = lpLocalAdrList;
		}
		else
		{
			FreePadrlist(lpLocalAdrList);
		}
	}

	return hRes;
} // HrAllocAdrList