Monday, November 13, 2006 11:03 AM
LarryOsterman
What's wrong with this code, part 19
Wow, I've done 19 of these? Cool.
I got an email question from a reader earlier today, and I realized that his question would make a great "What's wrong with this code" question.
He has a C++ function "GetValue" that is used to retrieve a value from something (it doesn't actually matter what). His function is intended to be called from OLE automation, so it has three versions, one which takes a VARIANT, one which takes an integer index, one which takes a BSTR key. If the input VARIANT is an integer, it assumes that it's an index, if the input VARIANT is a string, it assumes that it's a key.
Here's the version of the code as provided by the reader:
HRESULT GetValue(VARIANT Index, VARIANT& Value)
{
// Try Index as offset
HRESULT hr = VariantChangeType(&Index, &Index, 0, VT_I4);
if(SUCCEEDED(hr))
return GetValue(Index.lVal, Value);
// Try Index as key
hr = VariantChangeType(&Index, &Index, 0, VT_BSTR);
if(SUCCEEDED(hr))
return GetValue(Index.bstrVal, Value);
// Bad Index
return E_INVALIDARG;
}
His idea was that the function would be called like this:
void SomeFunction()
{
CComVariant Value;
GetValue(CComVariant(_T("1")), Value);
}
Unfortunately, this doesn't quite work :(. Why not?
As always Kudos and comments tomorrow.
Edit: I can't count :)