Существует множество примеров вызова IDispatch::Invoke с параметром BSTR*. У меня это работает со многими другими параметрами «SomeType*», но что бы я ни пытался, я либо получаю HRESULT несоответствия типа, E_OUTOFMEMORY, либо нарушение прав доступа. Мне кажется, что я делаю что-то не так с памятью, но я следую различным найденным примерам... В качестве примечания: последний аргумент "[out] UINT puArgErr" никогда не заполняется индексом аргумента, который вызывает проблему. Однако я знаю, что это третий аргумент типа BSTR (я успешно вызвал другой метод, который принимает два предыдущих аргумента).
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)] короткая GetCategory( короткая nIndx, короткая* nCat, BSTR* bszName);
Variation 1
правильно. Вы говорите, что это приводит к несоответствию типов — покажите объявление IDL метода, который вы пытаетесь вызвать. Похоже, объект на самом деле не ожидает параметраBSTR*
. - person Igor Tandetnik   schedule 09.07.2014DISPPARAMS
в обратном порядке - самый правый первый, самый левый последний.bszName
будет вv[0]
, а неv[2]
. - person Igor Tandetnik   schedule 10.07.2014