Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用所需的BSTR*参数正确调用IDispatch::Invoke_C++_Com_Invoke_Bstr_Idispatch - Fatal编程技术网

C++ 如何使用所需的BSTR*参数正确调用IDispatch::Invoke

C++ 如何使用所需的BSTR*参数正确调用IDispatch::Invoke,c++,com,invoke,bstr,idispatch,C++,Com,Invoke,Bstr,Idispatch,有许多示例说明如何使用BSTR*参数调用IDispatch::Invoke。我有很多其他的“SomeType*”参数,但不管我怎么做,我要么得到类型不匹配的HRESULT,要么得到E_OUTOFMEMORY或访问冲突。在我看来,我的记忆力似乎有问题,但我遵循我发现的不同例子。。。作为旁注,最后一个“[out]UINT puArgErr”参数从未填充导致问题的参数索引。但是,我知道这是BSTR类型的第三个参数(我已经成功调用了另一个接受前面两个参数的方法) * * * 我不明白为什么当我遵循BTR

有许多示例说明如何使用BSTR*参数调用IDispatch::Invoke。我有很多其他的“SomeType*”参数,但不管我怎么做,我要么得到类型不匹配的HRESULT,要么得到E_OUTOFMEMORY或访问冲突。在我看来,我的记忆力似乎有问题,但我遵循我发现的不同例子。。。作为旁注,最后一个“[out]UINT puArgErr”参数从未填充导致问题的参数索引。但是,我知道这是BSTR类型的第三个参数(我已经成功调用了另一个接受前面两个参数的方法)

*

*

*

我不明白为什么当我遵循BTR*参数的其他示例时,会发生这种情况。。。此外,我还有许多其他对IDispatch::Invoke的成功调用,但这个BTR*让我停了下来

绝望,请救命

补充:

IDL是: [id(0x00000171)] 短类别( 短nIndx, 短*nCat,
BSTR*bszName)

你们都在正确的轨道上@汉帕桑的评论将我引向“额头拍打”“尤里卡”时刻,他猜测这一时刻会在另一个参数上爆炸。第一个和第二个参数的类型不同。它们实际上是第二个和第三个参数。所以它实际上在我的“第一个”参数上爆炸了,类型不匹配

在我最初的概念验证版本中,我手动传递参数,并有意按照IDispatch::Invoke要求的相反顺序正确传递参数。在将其转换为一种更通用的方法(通过调用方传递的参数数组循环)的过程中,我在调用IDispatch::Invoke后将参数顺序颠倒过来,然后将它们返回到调用应用程序,但是,在调用Invoke之前,我忘了将它们颠倒过来

神圣的“你知道什么”的错误是如此深奥的人没有大量的经验,这种东西

一旦我确定了参数的顺序,所有的行为都完全符合预期。当然,我问题中的“变体1”是处理BSTR*参数的正确方法。为清楚起见,以下是为IDispatch::Invoke调用的BSTR*参数初始化变量参数的正确方法(在我的示例中,还有两个其他参数未在此处显示)


我相信变体1是正确的。您说它会导致“类型不匹配”——显示您试图调用的方法的IDL声明。看起来这个对象实际上并不需要一个
BSTR*
参数。很难回答为什么当你没有显示你试图调用的方法的定义时会出现问题,所以我们知道它需要什么参数类型。我很确定变体1是正确的,但它会产生类型不匹配[id(0x0000171)]短GetCategory(短nIndx、短*nCat、短BSTR*bszName);Argh,抱歉,用IDL:[id(0x00000171)]short-GetCategory(short-nIndx,short*nCat,BSTR*bszName)将注释的格式搞砸了;这通常是返回值,用[out,retval]修饰。需要使用Invoke的pVarResult参数。在第二个参数中,数组很可能会收缩并消亡,但要正确处理数组并不是那么容易。手工编写IDispatch代码是一种残酷而不寻常的惩罚,最好留给使用类型库的机器。比如说,给MFC向导一个旋转。我认为这行:
v[0]。vt=vt|BSTR | BT|BYREF
应该是
vt|BSTR | vt|BYREF
(vt|uu而不是BT|)
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. 
VARIANTARG* v = new VARIANTARG[3];
//...Init my first 2 args IN REVERSE (not shown here)

//Init my third arg which is the BSTR* parameter
VariantInit(v[0]);
BSTR val = SysAllocString(L"");
v[0].vt = VT_BSTR | VT_BYREF;
v[0].pbstrVal = &val;