我发现了this问题,但他们没有使用指针。

我有一个COM方法调用的方法,该方法需要一个指向bool的指针。此 bool(boolean) 值用于取消 call 者的长时间运行过程(如果需要,则可以进行录像)。

我可以以某种方式进行投射,但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

最佳答案

如果正确执行,则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的澄清后,我认为您正在尝试这样做。或可能接近的东西。

关于c++ - 如何将VARIANT_BOOL *转换为bool *,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23450926/

10-11 23:11
查看更多