我发现了this个问题,但他们没有使用指针。
我有一个方法,我的COM方法调用,需要一个指向bool的指针。此bool用于取消来自呼叫者的长时间运行过程(视频录制,如果您必须知道)。
我可以以某种方式投射它,但仍然有VARIANT_BOOL等于FALSE,反之亦然吗?
代码
HRESULT YourObject::YourComMethod(VARIANT_BOOL* pVarBool)
{
callYourNonComMethodHere((bool*)pVarBool);
return S_OK;
}
更新
所以,我了解到,尽管你可以将COM参数作为指针,但它们没有用处。这实际上并没有引用来自调用者的指针。
所以,我要做的是创建一个完全独立的COM对象,即CancellationToken
。然后,在我的实现中,我可以调用token.Cancel()
,然后YourComMethod
将具有更新的bool,表示长时间运行的方法应该取消。
我创建了一个示例项目来演示如何使用包装COM对象将指针传递给bool。
https://bitbucket.org/theonlylawislove/so-blocking-com-call/src
答案 0 :(得分:4)
VARIANT_BOOL 假设是两个值中的一个。 VARIANT_TRUE或VARIANT_FALSE。在关闭机会时,一些尼安德特人不明白,在那里我所有的错误的COM代码我通常认为如果它不是VARIANT_FALSE,那么它必须是真的。
所以:
HRESULT YourObject::YourComMethod(VARIANT_BOOL* pVarBool)
{
bool bval = (*pVarBool != VARIANT_FALSE); // do this if pVarBool is [in,out]
// bool bval = false; // otherwise do this if pVarBool is [out] only.
callYourNonComMethodHere(&bval);
*pVarBool = bval ? VARIANT_TRUE : VARIANT_FALSE;
return S_OK;
}
经过Matt的一点澄清,我想这就是你想要做的事情。或者可能接近它的东西。