0

VC6 で開発された ActiveX COM コンポーネントがあります。さまざまなブラウザーから COM API を呼び出せるように、その上に firebreath プラグインを作成しました。CDialog UI をポップアップする ActiveX コンポーネントに API が 1 つあります。Google Chrome ブラウザで dlg.DoModal() 関数が失敗しています。問題は Chrome のみで、この呼び出しで単純にクラッシュします。他のブラウザでは完全に動作します

Windows 7 では、Google Chrome と同様に動作しますが、問題は Windows XP にあります。

この問題に関するフィードバックをお寄せください。

ここにいくつかのコード スニペットを添付して、私がやろうとしていることを理解してもらいます

Firebreath プラグイン コード (プラグイン名は FBTest):

bool FBTest::onWindowAttached(FB::AttachedEvent *evt, FB::PluginWindow *piw)
 {
 // The window is attached; act appropriately   
try {

    /* Now that we have the plugin window, create the ActiveX container
       window as a child of the plugin, then create the ActiveX control
        as a child of the container.
    */

    FB::PluginWindowWin* pwnd = piw->get_as<FB::PluginWindowWin>();
    if(pwnd != NULL)
    {
        HWND hWnd = pwnd->getHWND();
        if(hWnd)
        {               
            // Create the ActiveX control container
            RECT rc;
            ::GetClientRect(hWnd, &rc);
            m_fbTestWin.Create(hWnd, &rc, 0, WS_VISIBLE|WS_CHILD);

            CComPtr<IUnknown> spControlTest;

                            //ETESTPROGID is prog id of activex component
            HRESULT hrTest = m_fbTestWin.CreateControlEx(ETESTPROGID, NULL, NULL, &spControlTest, GUID_NULL, NULL);

            if(SUCCEEDED(hrTest) && (spControlTest != NULL))
            {
                spControlTest.QueryInterface(&m_eTestAxCtl);
                g_eTestAxCtl = m_eTestAxCtl;
                if (m_eTestAxCtl)
                {
                    //TODO: should we throw a FB exception here?
                }
            }               
        }
    }
} catch(...) {
    //TODO: should we throw a FB exception here?
}
  return false;
}

void FBTest::TestFunc()
{   
    //hThread = (HANDLE)_beginthreadex(NULL, 0,&FBTest::Start, (void*)&m_eTestAxCtl, 0, &ThreadId);

if(m_eTestAxCtl)
{
    try {
        long nCode = -1;
        //This is call to API of Activex component which will popup the dialog
        HRESULT hr = m_eTestAxCtl->TestFunc();
        //return nCode;         
    }
    catch(...) {

    }
}

}

Activex コンポーネント コード:

STDMETHODIMP CTest::TestFunc()
{
//CTestDlg is ATL Dialog Object
    CTestDlg TestDlg;

//At this call Google chrome is crashing
if(!TestDlg.DoModal())
    return S_FALSE;

return S_OK;
}

1 つの HTML ページからプラグインの TestFunc() API を呼び出しており、IE および Firefox ブラウザーでダイログを表示していますが、Chrome がクラッシュしています。

助けてください。

4

1 に答える 1

0

いつ、どのように呼び出しているかについての情報を提供していないため、確かなことはわかりませんが、メインスレッドで DoModal を呼び出していると思います。これにより、メインスレッドがブロックされます。

プラグインでメイン スレッドをブロックしてはいけません。

別のスレッドで呼び出してみてください。

于 2013-03-29T05:35:21.073 に答える