我查看了有关使用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);
}
警告:
警告 C26476:表达式/符号
{{0, 0, 0, 0, {0}}}
使用了一个具有多种类型指针的裸联合体 'union' :请改用variant
(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
。
VARIANT vZoom; VariantInit(&vZoom);
进行初始化。或者使用建议的variant_t
或CComVariant
,它们会自动执行此操作。 - Barmak ShemiraniVariantInit
- 另一个我不知道的新函数! - Andrew Truckle