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 がクラッシュしています。
助けてください。