Necro!
I came across this issue again and the following code now works as a work-around.
Code:
i->PutItem( i->FindFreeSlot(0,0), *pDB->CreateBaseItem( pDB->GetItem( YOUR_ITEM_ID ), 0 ) );
CreateBaseItem must be called, only calling GetItem will result in the item being out of charges.