/// <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; }
_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