Элемент управления 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 ()

0 ответов

Другие вопросы по тегам