Based on the documentation for GetProps() at
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mobilesdk5/html/mob5lrfIItemGetProps.asp
I tried retrieving item properties both ways and either way, HRESULT
comes back successful but no values are retrieved:

// Allocate memory, then get item properties
// >>this always returns cbBuffer == 0 on 2nd GetProps() call

cbBuffer = 0;
hr = pItem->GetProps(rgPropId, 0, cProps, &prgPropvalUser,
&cbBuffer, NULL);
if(HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) == hr)
{
prgPropvalUser = (CEPROPVAL *) LocalAlloc(0, cbBuffer);
}
// cbBuffer is set to the number of bytes required to hold the
data.
hr = pItem->GetProps(rgPropId, 0, cProps, (CEPROPVAL
**)&prgPropvalUser, &cbBuffer, NULL);
if(FAILED(hr) || 0 == cbBuffer)
{
goto Exit;
}

// Alternately, you can let Outlook Mobile allocate memory, then get
item properties.
//>>this consistently returns 0 in prgPropvalPoom and cbBuffer
cbBuffer = 0;
hr = pItem->GetProps(rgPropId, CEDB_ALLOWREALLOC, cProps,
&prgPropvalPoom, &cbBuffer, hHeap);
wsprintf(buffer, TEXT("%ld = pItem->GetProps() - 3; 0x%X, 0x%X"), hr,
prgPropvalPoom, cbBuffer);
MessageBox(hwndParent, buffer, L"Debuggery", MB_OK);


if(FAILED(hr) || NULL == prgPropvalPoom || 0 == cbBuffer)
{
...

Re: IItem::GetProps() not returning POOM item properties by sid

sid
Thu Jun 22 03:25:20 CDT 2006


Dave wrote:
> Based on the documentation for GetProps() at
> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mobilesdk5/html/mob5lrfIItemGetProps.asp
> I tried retrieving item properties both ways and either way, HRESULT
> comes back successful but no values are retrieved:
>
> // Allocate memory, then get item properties
> // >>this always returns cbBuffer == 0 on 2nd GetProps() call
>
> cbBuffer = 0;
> hr = pItem->GetProps(rgPropId, 0, cProps, &prgPropvalUser,
> &cbBuffer, NULL);
> if(HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) == hr)
> {
> prgPropvalUser = (CEPROPVAL *) LocalAlloc(0, cbBuffer);
> }
> // cbBuffer is set to the number of bytes required to hold the
> data.
> hr = pItem->GetProps(rgPropId, 0, cProps, (CEPROPVAL
> **)&prgPropvalUser, &cbBuffer, NULL);
> if(FAILED(hr) || 0 == cbBuffer)
> {
> goto Exit;
> }
>
> // Alternately, you can let Outlook Mobile allocate memory, then get
> item properties.
> //>>this consistently returns 0 in prgPropvalPoom and cbBuffer
> cbBuffer = 0;
> hr = pItem->GetProps(rgPropId, CEDB_ALLOWREALLOC, cProps,
> &prgPropvalPoom, &cbBuffer, hHeap);
> wsprintf(buffer, TEXT("%ld = pItem->GetProps() - 3; 0x%X, 0x%X"), hr,
> prgPropvalPoom, cbBuffer);
> MessageBox(hwndParent, buffer, L"Debuggery", MB_OK);
>
>
> if(FAILED(hr) || NULL == prgPropvalPoom || 0 == cbBuffer)
> {
> ...

Hi, there!

One of the reasons for your problem could be the thing you do not
properly query IItem interface. The right way to get it is the
following:

//Example for contact items
::IPOutlookApp2* pApp = NULL;
////////
/// Here goes code for initialization of pApp, hope U know how to do it
:)
///////
::IFolder* pFolder = NULL;
hr = pApp->GetDefaultFolder(olFolderContacts, &pFolder);

::IContact* pContact = NULL;
::IItem* pItem = NULL;
::IPOutlookItemCollection* items = NULL;
hr = pFolder->get_Items(&items);
//just for example, recieving the first item from Contacts folder
if (SUCCEEDED(items->Item(1,
reinterpret_cast<IDispatch**>(&pContact))))
{
CEOID oid = 0;
pContact->get_Oid((long*)&oid);
pApp->GetItemFromOidEx(oid, 0, &pItem);
//// your code goes here
hr = pItem->GetProps(...);
//// your code goes here
if ( pItem )
{
pItem->Release();
pItem = NULL;
}
}

Also, here is the working call of ::IItem::GetProps() I use in my
project:

int cProps = 2;
CEPROPID rgPropId[] = { PIMPR_FILEAS, PIMPR_LAST_NAME };
CEPROPVAL *prgPropval = NULL;
ULONG cbBuffer = 0;
HANDLE hHeap = GetProcessHeap();

// ::IItem item - given pointer to ::IItem compatible object
hr = item->GetProps(rgPropId, CEDB_ALLOWREALLOC, cProps, &prgPropval,
&cbBuffer, hHeap);

if ( FAILED(hr) || prgPropval == NULL || cbBuffer == 0 )
{
// some deinitialization needs to be here
return NULL;
}

/// working with recieved properties' values

HeapFree(hHeap, 0, prgPropval);


If that didn't help, let me know about that.
Good luck :)