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 :)