gpt4 book ai didi

visual-c++ - 如何将 std::variant 作为 VARIANT* 传递给 ExecWB?

转载 作者:行者123 更新时间:2023-12-05 00:52:39 26 4
gpt4 key购买 nike

我看过这篇关于使用 std::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: Expression/symbol {{0, 0, 0, 0, {0}}} uses a naked union 'union ' with multiple type pointers: Use variant instead (type.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 通常是表示类型安全的好方法 discriminated unions , 它与 VARIANT 无关COM 中使用的结构。

在这种情况下,您需要使用不同的类型,例如 Microsoft 的 _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);
}

关于visual-c++ - 如何将 std::variant 作为 VARIANT* 传递给 ExecWB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69734537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com