Как правильно вызвать IDispatch :: Invoke с обязательным параметром BSTR *

Есть много примеров того, как вызвать IDispatch :: Invoke с параметром BSTR *. У меня это работает со многими другими параметрами «SomeType *», но независимо от того, что я пытаюсь, я получаю HRESULT типа Несоответствие типов, E_OUTOFMEMORY или нарушение прав доступа. Мне кажется, что я делаю что-то не так с памятью, но я следую различным примерам, которые я нашел ... Как примечание, финал "[out] UINT«Аргумент puArgErr» никогда не заполняется индексом аргумента, который вызывает проблему. Однако я знаю, что это третий аргумент типа BSTR (Я успешно вызвал другой метод, который принимает 2 предыдущих аргумента.)

VARIANTARG* v = new VARIANTARG[3];
//...Init my first 2 args
//Code omitted for initializing args 1 and 2 and wrapping everything up to call IDispatch->Invoke

//... Variation 1
VariantInit(v[2]);
BSTR val = SysAllocString(L"");
v[2].vt = VT_BSTR | BT_BYREF;
v[2].pbstrVal = &val;
//When I wrap everything up in the call to IDispatch::Invoke 
//this yields a HRESULT of Type Mismatch

*

//...Variation 2
VariantInit(v[2]);
BSTR val = SysAllocString(L"");
v[2].vt = VT_BSTR | BT_BYREF;
v[2].bstrVal = val;
//When I wrap everything up in the call to IDispatch::Invoke 
//this yields a HRESULT of E_OUTOFMEMORY

*

//...Variation 3
VariantInit(v[2]);
BSTR val = SysAllocString(L"RandomStringLargerThanTheMethodWillPlaceInTheOutParam");
v[2].vt = VT_BSTR | BT_BYREF;
v[2].bstrVal = val;
//When I wrap everything up in the call to IDispatch::Invoke 
//this yields an access violation

*

//...Variation 4
VariantInit(v[2]);
BSTR val = 0;
v[2].vt = VT_BSTR | BT_BYREF;
v[2].bstrVal = val;
//When I wrap everything up in the call to IDispatch::Invoke 
//this yields and HRESULT of 0x800706f4 A null reference pointer 
//was passed to the stub. 

Я не понимаю, почему, когда я слежу за другими примерами параметров BTR *, это происходит ... Более того, у меня есть много других успешных вызовов IDispatch :: Invoke, но этот BTR * застопорил меня.

БЕЗУМНЫЙ, ПОЖАЛУЙСТА, ПОМОГИТЕ!

Дополнение:

IDL: [id (0x00000171)] short GetCategory (short nIndx, short * nCat, BSTR * bszName);

Ответы на вопрос(1)

Ваш ответ на вопрос