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))如果你能用更简单的术语解释,对我会有帮助。@HansPassant我想我已经明白你希望我做什么了。此赋值dp.rgvarg[1].pdispVal=mock_项代码>,不应该像这样发生,但我应该查询IDispatch
接口并分配它。我理解对了吗?如果是,我应该怎样做呢?