Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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
Com 传递disparams_Com_Parameter Passing - Fatal编程技术网

Com 传递disparams

Com 传递disparams,com,parameter-passing,Com,Parameter Passing,我正在用下面的签名对一个函数进行单元测试 void foo(DISPPARAMS* pDispParams, VARIANT* pVarResult) 我需要从外部传递这个pDispParams,指向我手头的模拟类型。我正在使用GMock创建模拟类型 我在堆栈上本地创建一个模拟对象,并尝试像这样传递它 Mock_Item mock_Item; //my mock type on which I would like to set expectations DISPPARAMS dp = {

我正在用下面的签名对一个函数进行单元测试

void foo(DISPPARAMS* pDispParams, VARIANT* pVarResult)
我需要从外部传递这个
pDispParams
,指向我手头的模拟类型。我正在使用GMock创建模拟类型

我在堆栈上本地创建一个模拟对象,并尝试像这样传递它

Mock_Item mock_Item; //my mock type on which I would like to set expectations

DISPPARAMS dp = { nullptr, nullptr, 0, 0 };
VARIANT *args = new VARIANT[1];
VariantInit(&args[0]);
args[0].vt = VT_DISPATCH;
args[0].pdispVal = &mock_Item;
dp.rgvarg = args;
dp.cArgs = 1;
foo
,在内部执行以下操作:

IDispatch* pCtrl(nullptr);
并尝试从传递给它的
pDispParams
中获取值

if (pDispParams != nullptr && 
pDispParams->rgvarg != nullptr && 
VT_DISPATCH == pDispParams->rgvarg[1].vt)
        pCtrl = pDispParams->rgvarg[1].pdispVal;

但是有了这个
pCtrl
,结果总是
nullptr
。我不太擅长使用这些与COM相关的类型我应该如何填充
变量
DISPPARAMS
,以便
pCtrl
将正确指向我的模拟对象?
特别是,在我看来,条件(
VT_DISPATCH==pDispParams->rgvarg[1].VT
)失败,正如我在调试器的监视窗口中看到的那样。它的值不是
9
VT\u DISPATCH
Mock_项
是从您可能猜到的
IDispatch
派生而来的。

新建
对象看起来很有效。我不知道发生了什么事

CComPtr<Mock_Item> mock_Item = new Mock_Item;
...
dp.rgvarg[1].pdispVal = mock_Item;
dp.rgvarg[1].vt = VT_DISPATCH;
CComPtr mock\u Item=新的mock\u Item;
...
dp.rgvarg[1].pdispVal=mock_项;
dp.rgvarg[1].vt=vt\u调度;

这只是偶然发生的,您应该调用QueryInterface来获取IDispatch接口指针。@HansPassant谢谢。我不知道你到底是什么意思。然而,
foo
似乎在查询不同的接口。(它似乎没有调用
QueryInterface
explicit,但有一些强制转换似乎在内部执行此操作。)即,满足以下期望。
const IID IID\u Item=\uuuuuuuuIdof(\u productionItem);EXPECT_CALL(*mock_Item,QueryInterface(_productionItem,))).Times(1).WillOnce(DoAll(SetArgPointee(&mock_Item),Return(S_OK))dp.rgvarg[1].pdispVal=mock_项,不应该像这样发生,但我应该查询
IDispatch
接口并分配它。我理解对了吗?如果是,我应该怎样做呢?