Re: A problem about CHtmlView::Navigate2
I think you should wait for the first Navigate2 to compete before you issue
the next one. Earlier I read that you don't want to use OnNavigateComplete2.
Here is an alternative:
//navigate to url
m_pHTMLView->Navigate2(Filename);
//don't let the function go any further until the page load is done
while (m_pHTMLView->GetReadyState() != READYSTATE_COMPLETE)
{
((CMyApp *)AfxGetApp())->Yeild();
}
//the loading is done, do something with the page. (In my case I called
m_pHTMLView->OnFilePrint)
void CMyApp::Yeild()
{
MSG Msg;
while (PeekMessage(&Msg,NULL,0,0,PM_REMOVE))
{
if (!PreTranslateMessage(&Msg))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
}
AliR.
"Tom Lee" <Tom.Lee@community.nospam> wrote in message
news:BC70C71D-74E5-4133-850A-E2E1FC0EB120@microsoft.com...
I found if I call the CHtmlView::Navigate2 very quickly, it will hang the
process.
I made a tiny MDI application to verify this problem. The CTestHVViewis
derived from CHtmlView.
In the application, I created a timer on CTestHVView::OnInitialUpdate, and
call Navigate2 to a xml file in the OnTimer function.
The application will will hang. From the call stack, it is hanged in
msxml3.dll.
Here is some codes for reference:
class CTestHVView : public CHtmlView
{
...
protected:
vector<CString> m_vctFullPath;
vector<CString>::iterator m_curIter;
...
};
void CTestHVView::OnInitialUpdate()
{
CHtmlView::OnInitialUpdate();
//Get the XML files full path and put them into a vector.
TCHAR szPath[MAX_PATH*4];
ZeroMemory(szPath, MAX_PATH*4);
GetCurrentDirectory(MAX_PATH*4, szPath);
CString csDir(szPath);
csDir += _T("\\XML\\");
CString csTmp(csDir+_T("*.xml"));
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind = FindFirstFile(csTmp, &FindFileData);
if (INVALID_HANDLE_VALUE == hFind)
{
return;
}
OutputDebugString(_T("++++++++Use the following XML to test+++++++\n"));
do{
m_vctFullPath.push_back(csDir+FindFileData.cFileName);
OutputDebugString(csDir+FindFileData.cFileName+_T("\n"));
}while(FindNextFile(hFind, &FindFileData));
FindClose(hFind);
OutputDebugString(_T("++++++++Use the above XML to test+++++++\n"));
m_curIter = m_vctFullPath.begin();
this->SetTimer(1, 10, NULL);
}
void CTestHVView::OnTimer(UINT nIdEvent)
{
static int nMax = 1000;
static int i = 0;
if (++i > nMax)
{
KillTimer(1);
i = 0;
return;
}
if (0 == m_vctFullPath.size())
{
KillTimer(1);
i = 0;
return;
}
if (m_curIter == m_vctFullPath.end())
{
m_curIter = m_vctFullPath.begin();
}
this->Navigate2(*m_curIter, NULL, NULL);
CString cs;
cs.Format(_T("i = %d, Navigate2 %s\n"), i, *m_curIter);
OutputDebugString(cs);
m_curIter++;
}
//Use this function to tigger the nvaigate2 again.
void CTestHVView::OnRunAgain()
{
SetTimer(1, 10, NULL);
}
Any comments are very appreciated!
Thanks,
--
Tom Lee