如何将 std::variant 作为 VARIANT* 传递给 ExecWB?

2024-03-29

我看过这篇关于使用的文章std::variant https://en.cppreference.com/w/cpp/utility/variant。这是因为以下代码引发了代码分析警告:

void CChristianLifeMinistryHtmlView::OnTimer(UINT_PTR nIDEvent)
{
    if (nIDEvent == ID_TIMER_ZOOM)
    {
        //get the zoom value
        VARIANT vZoom{};
        vZoom.vt = VT_I4;
        vZoom.lVal = 0;
        ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, nullptr, &vZoom);
        TRACE("zoom %d\n", vZoom.lVal);

        //kill the timer
        KillTimer(nIDEvent);

        GetParent()->PostMessage(UWM_HTMLVIEW_CHANGE_ZOOM_MSG, vZoom.lVal);
        return;
    }

    CHtmlView::OnTimer(nIDEvent);
}

警告:

Warning C26476 https://learn.microsoft.com/en-us/cpp/code-quality/c26476?view=msvc-160:表达/符号{{0, 0, 0, 0, {0}}}使用带有多个类型指针的裸联合“union”:使用variant相反(类型7)。

我开始尝试更改代码:

void CChristianLifeMinistryHtmlView::OnTimer(UINT_PTR nIDEvent)
{
    if (nIDEvent == ID_TIMER_ZOOM)
    {
        //get the zoom value
        std::variant<long> vZoom(0);

        ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, nullptr, &vZoom);
        TRACE("zoom %d\n", vZoom.lVal);

        //kill the timer
        KillTimer(nIDEvent);

        GetParent()->PostMessage(UWM_HTMLVIEW_CHANGE_ZOOM_MSG, vZoom.lVal);
        return;
    }

    CHtmlView::OnTimer(nIDEvent);
}

但问题是ExecWB期望一个VARIANT *我不知道如何通过这个std::variant.


尽管建议过于笼统而无用,但诊断是正确的。尽管std::variant一般来说,是表示类型安全的好方法受歧视的工会 https://en.cppreference.com/w/cpp/language/union,这与VARIANT https://learn.microsoft.com/en-us/windows/win32/winauto/variant-structureCOM 中使用的结构。

在这种情况下,您需要使用不同的类型,例如 Microsoft 的_variant_t https://learn.microsoft.com/en-us/cpp/cpp/variant-t-class班级。它封装了原始VARIANT,并处理其受歧视联盟的内部结构。

它提供了几个正确管理内部状态设置的构造函数,并派生自VARIANT这样任何实例的地址都可以传递给任何接受VARIANT*:

#include <comutil.h>
#pragma comment(lib, "comsuppw.lib")

int main() {
    auto zoom{ _variant_t(long{ 0 }) };
    ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, nullptr, &zoom);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 std::variant 作为 VARIANT* 传递给 ExecWB? 的相关文章

随机推荐