Элемент управления Flash ActiveX генерирует исключения с плавающей запятой в x64
У меня есть диалог MFC, который использует флэш-плеер активного управления х. У меня нет проблем в программе x86, но при сборке для x64 я начинаю получать исключения с плавающей запятой в цикле сообщений для диалога. Я могу справиться с первым из них, но не со всеми.
Создание элемента управления выполняется так же, как и в OnInitDialog().
typedef HRESULT (WINAPI *LPAtlAxWinInit)();
typedef HRESULT (WINAPI *LPAtlAxGetControl)(HWND hwnd, IUnknown** unk);
#define MsgLoopWhile(a) while(a) { GetMessage(&msg,0,0,0); DispatchMessage(&msg); }
LPAtlAxWinInit AtlAxWinInit = (LPAtlAxWinInit)GetProcAddress(
LoadLibrary(_T("atl")),"AtlAxWinInit");
LPAtlAxGetControl AtlAxGetControl = (LPAtlAxGetControl)GetProcAddress(
LoadLibrary(_T("atl")),"AtlAxGetControl");
HRESULT hr = AtlAxWinInit();
if (FAILED(hr))
return FALSE;
m_hFlashWnd = CreateWindow(_T("AtlAxWin"), m_strFileName, WS_CHILD|WS_VISIBLE, 0, 0, 0, 0, this->GetSafeHwnd(), 0, 0, 0);
if(!m_hFlashWnd)
{
::AfxMessageBox(LoadStr(IDS_FLASH_NOT_INSTALLED));
::PostMessage(WM_CLOSE);
return FALSE;
}
CComQIPtr<IUnknown, &IID_IUnknown> pComI = NULL;
hr = AtlAxGetControl(m_hFlashWnd, &pComI);
if (FAILED(hr))
return FALSE;
MSG msg;
CComQIPtr<IWebBrowser2> pComBrow = pComI;
CComPtr<IDispatch> pDisp;
if(pComBrow)
MsgLoopWhile( !pComBrow->get_Document(&pDisp) && !pDisp ); // Document loading loop
CComQIPtr<IHTMLDocument2> pComHtml = pDisp;
CComPtr<IHTMLElementCollection> pElems;
hr = pComHtml ? pComHtml->get_embeds(&pElems) : -1;
if(SUCCEEDED(hr))
{
CComVariant id;
pDisp = NULL;
MsgLoopWhile( pElems && !pElems->item(id,id,&pDisp) && !pDisp );
}
Исключения выбрасываются в последнем цикле.
Сброс флагов исключений или использование обработчика SEH не работает
Стек cal выглядит следующим образом
mshtml.dll! CLayout:: GetElementLayoutTransform ()
mshtml.dll! CLayout:: CalcSize ()
mshtml.dll! CLayout:: CalcTopLayoutSize ()
mshtml.dll! CView:: EnsureSize ()
mshtml.dll! CView:: EnsureView ()
mshtml.dll! CDoc:: RunningToInPlace ()
MSHTML.dll! CServer:: Show ()
ieframe.dll! CDocObjectHost:: _ ShowMsoView ()
ieframe.dll! CDocObjectHost:: ActivateMe ()
mshtml.dll! CServer:: ActivateView ()
mshtml.dll! CServer:: DoUIActivate ()
MSHTML.dll! CServer:: DoVerb ()
mshtml.dll! CMarkup:: Navigate ()
ieframe.dll! CDocObjectHost:: _ ActivateMsoView ()
ieframe.dll! CDocObjectHost:: UIActivate ()
ieframe.dll! CDocObjectView:: UIActivate ()
ieframe.dll! CBaseBrowser2:: _ UIActivateView ()
ieframe.dll! CBaseBrowser2:: v_ActivatePendingView ()
ieframe.dll! CWebBrowserSB:: v_ActivatePendingView ()
ieframe.dll! CBaseBrowser2:: _ ExecShellDocView ()
Ieframe.dll!CBaseBrowser2::Exec()
Ieframe.dll!CWebBrowserSB::Exec()
Ieframe.dll! CDocObjectHost:: _ OnReadyState ()
ieframe.dll! CDocObjectHost:: _ OnChangedReadyState ()
ieframe.dll! CDocObjectHost:: OnChanged ()
mshtml.dll! CBase:: FirePropertyNotify ()
MSHTML.dll! CMarkup:: SetReadyState ()
mshtml.dll! CMarkup:: SetInteractiveInternal ()
mshtml.dll! CMarkup:: RequestReadystateInteractive ()
mshtml.dll! CMarkup:: BlockScriptExecutionHelper ()
mshtml.dll! CHtmPost:: Exec ()
user32.dll! DefWindowProcWorker ()