100分dialog中嵌入Html出现的有关问题
100分求助:dialog中嵌入Html出现的问题
创建一个dialog,添加text control控件
从CHtmlView派生了CCtrlHtml类,在对话框初始化的时候创建html
生成成功,运行的时候报错
“dlgHtml.exe 中的 0x00413826 处未处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突”
跟踪发现0xcccccccc 为CCtrlHtml类指针m_page的值
主要实现代码也不太多,请大家帮忙看看
主要代码如下:
CCtrlHtml头文件:
CCtrlHtml实现文件:
对话框初始化函数
------解决方案--------------------
0xcccccccc表示指针在使用之前未赋值。
在进行有条件初始化的时候不要跳过这种指针。
------解决方案--------------------
CRect rect;
GetClientRect(&rect);
CFrame *pFrame = new CFrameWnd;
CHtmlView *pView = NULL;
if (pFrame != NULL)
{
pFrame->Create(NULL,NULL,WS_VISIBLE|WS_CHILD,rect,this);
CCreateContext cc;
cc.m_pCurrentDoc = new CMyDocumentEx(); //自己重载的一个CDocument类,使其构造函数//和析构函数为public类型就行了
cc.m_pNewViewClass = RUNTIME_CLASS(CGMSHtmlView);
pView=(CHtmlView*)(pFrame->CreateView(&cc));
pView->UpdateWindow();
pView->m_pMainDlg = m_pParentWnd;
pView->m_pHtmlDlg = this;
if (!m_strUrl.IsEmpty())
{
m_pView->Navigate2(m_strUrl);
}
//获取浏览器的对象指针
/* LPDISPATCH pDispatch = m_pView->GetApplication();
ASSERT(pDispatch != NULL);
pDispatch->QueryInterface(IID_IWebBrowser2,(void **)&m_pIWebBroswer);
*/
}//
------解决方案--------------------
你看看CreateFromStatic在CCtrlHtml类中哪里调用过,如果调用过一般不能这样使用的.
创建一个dialog,添加text control控件
从CHtmlView派生了CCtrlHtml类,在对话框初始化的时候创建html
生成成功,运行的时候报错
“dlgHtml.exe 中的 0x00413826 处未处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突”
跟踪发现0xcccccccc 为CCtrlHtml类指针m_page的值
主要实现代码也不太多,请大家帮忙看看
主要代码如下:
CCtrlHtml头文件:
- C/C++ code
class CCtrlHtml : public CHtmlView { //略 DECLARE_MESSAGE_MAP() public: BOOL CreateFromStatic(UINT nID,CWnd* pParent); virtual void PostNcDestroy() { } public: afx_msg void OnDestroy(); afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message); public: virtual void OnBeforeNavigate2( LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel); virtual void OnAppCmd(LPCTSTR lpszWhere) { } };
CCtrlHtml实现文件:
- C/C++ code
BOOL CCtrlHtml::CreateFromStatic(UINT nID, CWnd* pParent) { CStatic wndStatic; if (!wndStatic.SubclassDlgItem(nID, pParent)) return FALSE; // 获取静态控件的尺寸,并销毁该控件的窗口; CRect rc; wndStatic.GetWindowRect(&rc); pParent->ScreenToClient(&rc); wndStatic.DestroyWindow(); // 创建一个HtmlView控件; return Create( NULL, // class name NULL, // title (WS_CHILD | WS_VISIBLE ), // style rc, // rectangle pParent, // parent nID, // control ID NULL); // frame/doc context not used }
对话框初始化函数
- C/C++ code
BOOL CdlgHtmlDlg::OnInitDialog() { //略 if( m_page )//对话框头文件有如下定义CCtrlHtml *m_page; { m_html = "http://www.baidu.com"; m_szTitle = "网页测试"; //VERIFY(m_page->CreateFromStatic(IDC_STATIC_HTMLVIEW, this)); m_page->CreateFromStatic(IDC_STATIC_HTML, this); CRect rect; GetClientRect( rect ); //if( m_page && m_page->GetSafeHwnd() && m_page->IsWindowVisible() ) this->SetWindowText( m_szTitle ); m_page->MoveWindow( rect.left,rect.top,rect.right,rect.bottom ); m_page->Navigate( m_html ); } return TRUE; // 除非将焦点设置到控件,否则返回 TRUE }
------解决方案--------------------
0xcccccccc表示指针在使用之前未赋值。
在进行有条件初始化的时候不要跳过这种指针。
------解决方案--------------------
CRect rect;
GetClientRect(&rect);
CFrame *pFrame = new CFrameWnd;
CHtmlView *pView = NULL;
if (pFrame != NULL)
{
pFrame->Create(NULL,NULL,WS_VISIBLE|WS_CHILD,rect,this);
CCreateContext cc;
cc.m_pCurrentDoc = new CMyDocumentEx(); //自己重载的一个CDocument类,使其构造函数//和析构函数为public类型就行了
cc.m_pNewViewClass = RUNTIME_CLASS(CGMSHtmlView);
pView=(CHtmlView*)(pFrame->CreateView(&cc));
pView->UpdateWindow();
pView->m_pMainDlg = m_pParentWnd;
pView->m_pHtmlDlg = this;
if (!m_strUrl.IsEmpty())
{
m_pView->Navigate2(m_strUrl);
}
//获取浏览器的对象指针
/* LPDISPATCH pDispatch = m_pView->GetApplication();
ASSERT(pDispatch != NULL);
pDispatch->QueryInterface(IID_IWebBrowser2,(void **)&m_pIWebBroswer);
*/
}//
------解决方案--------------------
你看看CreateFromStatic在CCtrlHtml类中哪里调用过,如果调用过一般不能这样使用的.