CWebBrowser2是不是有Bug?我在AX控件中无法使用它,老是在ASSERT中说CWnd不是窗口

weikeming 2001-08-28 02:18:08
CWebBrowser2是不是有Bug?我在AX控件中无法使用它,老是在ASSERT中说CWnd不是窗口
...全文
285 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
weikeming 2001-09-01
  • 打赏
  • 举报
回复
那个补丁啊?微软的补丁有六百多M,下不完。
蒋晟 2001-08-31
  • 打赏
  • 举报
回复
win2k 用VC要打补丁的。
111222 2001-08-30
  • 打赏
  • 举报
回复
http://www.microsoft.com/msj

其中的c/c++ faq里面有你要的(慢慢找)
weikeming 2001-08-30
  • 打赏
  • 举报
回复
还是不行!!!!!
我打算放弃了,完全没有希望...

@_@

感谢各位捧场,大家把这170分分了呗.
weikeming 2001-08-30
  • 打赏
  • 举报
回复
唉,我再试试。
我的系统是win2k server,vc6,编译器是2000.6月的吧,ie是5.0
蒋晟 2001-08-30
  • 打赏
  • 举报
回复
怎么不行?我这个肯定可以通过。
weikeming 2001-08-29
  • 打赏
  • 举报
回复
kao,大哥,你够狠,我明天就试试,
如果行,一定给你分。等着。
蒋晟 2001-08-29
  • 打赏
  • 举报
回复
#if !defined(AFX_ABOUTBOX_H__2FFD6023_3D1C_11D4_8DEC_0000B4B17937__INCLUDED_)
#define AFX_ABOUTBOX_H__2FFD6023_3D1C_11D4_8DEC_0000B4B17937__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// AboutBox.h : header file
//
#include ".\Component\webbrowser2.h"
/////////////////////////////////////////////////////////////////////////////
// CAboutBox dialog

class CAboutBox : public CDialog
{
// Construction
public:
CAboutBox(CWnd* pParent = NULL); // standard constructor
virtual ~CAboutBox();
// Dialog Data
//{{AFX_DATA(CAboutBox)
enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA
// Attributes
protected:
CWebBrowser2 m_wndBrowser;
IWebBrowser2* m_pBrowserApp;
// Operations
protected:
BOOL LoadFromResource(LPCTSTR lpszResource);
BOOL LoadFromResource(UINT nRes);
BOOL ReplaceHtmlByID(LPCTSTR lpszTagID,LPCTSTR lpszHtml,BOOL bIsInnerHtml);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutBox)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
void OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags,
LPCTSTR lpszTargetFrameName, CByteArray& baPostedData,
LPCTSTR lpszHeaders, BOOL* pbCancel);
void Navigate(LPCTSTR URL, DWORD dwFlags = 0,
LPCTSTR lpszTargetFrameName = NULL,
LPCTSTR lpszHeaders = NULL, LPVOID lpvPostData = NULL,
DWORD dwPostDataLen = 0);
void Navigate2(LPITEMIDLIST pIDL, DWORD dwFlags = 0,
LPCTSTR lpszTargetFrameName = NULL);
void Navigate2(LPCTSTR lpszURL, DWORD dwFlags = 0,
LPCTSTR lpszTargetFrameName = NULL, LPCTSTR lpszHeaders = NULL,
LPVOID lpvPostData = NULL, DWORD dwPostDataLen = 0);
void Navigate2(LPCTSTR lpszURL, DWORD dwFlags,
CByteArray& baPostedData,
LPCTSTR lpszTargetFrameName = NULL, LPCTSTR lpszHeader = NULL);
virtual void OnAppCmd(LPCTSTR lpszWhere);
// Implementation
protected:

// Generated message map functions
//{{AFX_MSG(CAboutBox)
virtual BOOL OnInitDialog();
afx_msg void OnBeforeNavigate2Explorer(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel);
afx_msg void OnDestroy();
afx_msg void OnDocumentCompleteExplorer(LPDISPATCH pDisp, VARIANT FAR* URL);
DECLARE_EVENTSINK_MAP()
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_ABOUTBOX_H__2FFD6023_3D1C_11D4_8DEC_0000B4B17937__INCLUDED_)
/////////////////////////////////////////////////////////////////////////////
// CAboutBox dialog
CAboutBox::CAboutBox(CWnd* pParent /*=NULL*/)
: CDialog(CAboutBox::IDD, pParent)
{
//{{AFX_DATA_INIT(CAboutBox)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_pBrowserApp = NULL;
}

CAboutBox::~CAboutBox()
{
if (m_pBrowserApp != NULL)
m_pBrowserApp->Release();
}

void CAboutBox::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutBox)
DDX_Control(pDX, IDC_EXPLORER, m_wndBrowser);
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutBox, CDialog)
//{{AFX_MSG_MAP(CAboutBox)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BEGIN_EVENTSINK_MAP(CAboutBox, CDialog)
//{{AFX_EVENTSINK_MAP(CAboutBox)
ON_EVENT(CAboutBox, IDC_EXPLORER, 250 /* BeforeNavigate2 */, OnBeforeNavigate2Explorer, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
ON_EVENT(CAboutBox, IDC_EXPLORER, 259 /* DocumentComplete */, OnDocumentCompleteExplorer, VTS_DISPATCH VTS_PVARIANT)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAboutBox message handlers

BOOL CAboutBox::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
LPUNKNOWN lpUnk = m_wndBrowser.GetControlUnknown();
HRESULT hr = lpUnk->QueryInterface(IID_IWebBrowser2, (void**) &m_pBrowserApp);
if (!SUCCEEDED(hr))
{
m_pBrowserApp = NULL;
m_wndBrowser.DestroyWindow();
DestroyWindow();
return FALSE;
}
//Navigate2("C:\\Windows\\Readme.htm");
LoadFromResource("About.Htm");
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}




void CAboutBox::OnBeforeNavigate2Explorer(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel)
{
// TODO: Add your control notification handler code here
ASSERT(V_VT(URL) == VT_BSTR);
ASSERT(V_VT(TargetFrameName) == VT_BSTR);
ASSERT(V_VT(PostData) == (VT_VARIANT | VT_BYREF));
ASSERT(V_VT(Headers) == VT_BSTR);
ASSERT(Cancel != NULL);

USES_CONVERSION;

VARIANT* vtPostedData = V_VARIANTREF(PostData);
CByteArray array;
if (V_VT(vtPostedData) & VT_ARRAY)
{
// must be a vector of bytes
ASSERT(vtPostedData->parray->cDims == 1 && vtPostedData->parray->cbElements == 1);

vtPostedData->vt |= VT_UI1;
COleSafeArray safe(vtPostedData);

DWORD dwSize = safe.GetOneDimSize();
LPVOID pVoid;
safe.AccessData(&pVoid);

array.SetSize(dwSize);
LPBYTE lpByte = array.GetData();

memcpy(lpByte, pVoid, dwSize);
safe.UnaccessData();
}
// make real parameters out of the notification

CString strTargetFrameName(V_BSTR(TargetFrameName));
CString strURL = V_BSTR(URL);
CString strHeaders = V_BSTR(Headers);
DWORD nFlags = V_I4(Flags);

// notify the user's class

OnBeforeNavigate2(strURL, nFlags, strTargetFrameName,array, strHeaders, Cancel);

}

BOOL CAboutBox::LoadFromResource(LPCTSTR lpszResource)
{
HINSTANCE hInstance = AfxGetResourceHandle();
ASSERT(hInstance != NULL);

CString strResourceURL;
BOOL bRetVal = TRUE;
LPTSTR lpszModule = new TCHAR[_MAX_PATH];

if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
{
strResourceURL.Format(_T("res://%s/%s"), lpszModule, lpszResource);
Navigate(strResourceURL, 0, 0, 0);
}
else
bRetVal = FALSE;

delete [] lpszModule;
return bRetVal;
}

BOOL CAboutBox::LoadFromResource(UINT nRes)
{
HINSTANCE hInstance = AfxGetResourceHandle();
ASSERT(hInstance != NULL);

CString strResourceURL;
BOOL bRetVal = TRUE;
LPTSTR lpszModule = new TCHAR[_MAX_PATH];

if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
{
strResourceURL.Format(_T("res://%s/%d"), lpszModule, nRes);
Navigate(strResourceURL, 0, 0, 0);
}
else
bRetVal = FALSE;

delete [] lpszModule;
return bRetVal;
}

void CAboutBox::Navigate(LPCTSTR lpszURL, DWORD dwFlags /* = 0 */,
LPCTSTR lpszTargetFrameName /* = NULL */ ,
LPCTSTR lpszHeaders /* = NULL */, LPVOID lpvPostData /* = NULL */,
DWORD dwPostDataLen /* = 0 */)
{
CString strURL(lpszURL);
BSTR bstrURL = strURL.AllocSysString();

COleSafeArray vPostData;
if (lpvPostData != NULL)
{
if (dwPostDataLen == 0)
dwPostDataLen = lstrlen((LPCTSTR) lpvPostData);

vPostData.CreateOneDim(VT_UI1, dwPostDataLen, lpvPostData);
}

m_pBrowserApp->Navigate(bstrURL,
COleVariant((long) dwFlags, VT_I4),
COleVariant(lpszTargetFrameName, VT_BSTR),
vPostData,
COleVariant(lpszHeaders, VT_BSTR));
}

void CAboutBox::Navigate2(LPITEMIDLIST pIDL, DWORD dwFlags /* = 0 */,
LPCTSTR lpszTargetFrameName /* = NULL */)
{
ASSERT(m_pBrowserApp != NULL);

COleVariant vPIDL(pIDL);
COleVariant empty;

m_pBrowserApp->Navigate2(vPIDL,
COleVariant((long) dwFlags, VT_I4),
COleVariant(lpszTargetFrameName, VT_BSTR),
empty, empty);
}

void CAboutBox::Navigate2(LPCTSTR lpszURL, DWORD dwFlags /* = 0 */,
LPCTSTR lpszTargetFrameName /* = NULL */,
LPCTSTR lpszHeaders /* = NULL */,
LPVOID lpvPostData /* = NULL */, DWORD dwPostDataLen /* = 0 */)
{
ASSERT(m_pBrowserApp != NULL);

COleSafeArray vPostData;
if (lpvPostData != NULL)
{
if (dwPostDataLen == 0)
dwPostDataLen = lstrlen((LPCTSTR) lpvPostData);

vPostData.CreateOneDim(VT_UI1, dwPostDataLen, lpvPostData);
}

COleVariant vURL(lpszURL, VT_BSTR);
COleVariant vHeaders(lpszHeaders, VT_BSTR);
COleVariant vTargetFrameName(lpszTargetFrameName, VT_BSTR);
COleVariant vFlags((long) dwFlags, VT_I4);

m_pBrowserApp->Navigate2(vURL,
vFlags, vTargetFrameName, vPostData, vHeaders);
}

void CAboutBox::Navigate2(LPCTSTR lpszURL, DWORD dwFlags,
CByteArray& baPostData, LPCTSTR lpszTargetFrameName /* = NULL */,
LPCTSTR lpszHeaders /* = NULL */)
{
ASSERT(m_pBrowserApp != NULL);

COleVariant vPostData = baPostData;
COleVariant vURL(lpszURL, VT_BSTR);
COleVariant vHeaders(lpszHeaders, VT_BSTR);
COleVariant vTargetFrameName(lpszTargetFrameName, VT_BSTR);
COleVariant vFlags((long) dwFlags, VT_I4);

ASSERT(m_pBrowserApp != NULL);

m_pBrowserApp->Navigate2(vURL, vFlags, vTargetFrameName,
vPostData, vHeaders);
}

void CAboutBox::OnDestroy()
{
m_pBrowserApp->Release(); // RELEASE(m_pBrowserApp);
CDialog::OnDestroy();
// TODO: Add your message handler code here

}

void CAboutBox::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags,
LPCTSTR lpszTargetFrameName, CByteArray& baPostData,
LPCTSTR lpszHeaders, BOOL* bCancel)
{
// default to continuing
* bCancel = FALSE;

// user will override to handle this notification
UNREFERENCED_PARAMETER(nFlags);UNREFERENCED_PARAMETER(lpszTargetFrameName);UNREFERENCED_PARAMETER(baPostData);UNREFERENCED_PARAMETER(lpszHeaders);
const char APP_PROTOCOL[] = "app:";
int len = _tcslen(APP_PROTOCOL);
if (_tcsnicmp(lpszURL, APP_PROTOCOL, len)==0) {
OnAppCmd(lpszURL + len);
*bCancel = TRUE;//handle user-defined protocal
}
}
void CAboutBox::OnAppCmd(LPCTSTR lpszWhere)
{
if (_tcsicmp(lpszWhere,_T("ok"))==0) {
SendMessage(WM_COMMAND,IDOK);
}
}

BOOL CAboutBox::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message==WM_KEYDOWN){
BOOL bF11Down=(::GetKeyState(VK_F11) < 0);
BOOL bF12Down=(::GetKeyState(VK_F12) < 0);
if(bF11Down){
LoadFromResource("EasterEgg.Htm");
return TRUE;
}
if(bF12Down){
LoadFromResource("Poet.HTM");
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}

BOOL CAboutBox::ReplaceHtmlByID(LPCTSTR lpszTagID,LPCTSTR lpszHtml,BOOL bIsInnerHtml)
{
CComDispatchDriver pHTMLDispatch(m_wndBrowser.GetDocument());
if(pHTMLDispatch.p){
HRESULT hr;
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> pHTMLDocument(pHTMLDispatch);
if(pHTMLDocument.p){
CComPtr<IHTMLElementCollection> pHTMLElementCollection;
hr=pHTMLDocument->get_all(&pHTMLElementCollection);
if(hr==S_OK && pHTMLElementCollection.p!=NULL){
LONG celem;
hr=pHTMLElementCollection->get_length(&celem);
if(hr==S_OK){
for(int i=0;i<celem;i++){
COleVariant varIndex,var2;//var2 is not used because accessing index,not name
varIndex.vt=VT_UINT;
varIndex.lVal=i;
CComDispatchDriver pDisp;
hr=pHTMLElementCollection->item(varIndex,var2,&pDisp);
if(hr==S_OK){
CComQIPtr<IHTMLElement, &IID_IHTMLElement> pHTMLElement(pDisp);
if(pHTMLElement){
//find html element
BSTR bstrTagID;
if(pHTMLElement->get_id(&bstrTagID)==S_OK){
if(bstrTagID!=NULL){
_bstr_t bstrHTML(lpszHtml);
_bstr_t bstrTagIDToCompare(lpszTagID);
_bstr_t _bstrTagID(bstrTagID,FALSE);
if(_bstrTagID==bstrTagIDToCompare){
if(bIsInnerHtml)
pHTMLElement->put_innerHTML(bstrHTML);
else
pHTMLElement->put_outerHTML(bstrHTML);
#ifdef _DEBUG
BSTR bstrTag;
hr=pHTMLElement->get_outerHTML(&bstrTag);
CString strTag=bstrTag;
::afxDump<<strTag;
#endif
}
}
}
}
}
}
}
}
}
}
return TRUE;
}

void CAboutBox::OnDocumentCompleteExplorer(LPDISPATCH pDisp, VARIANT FAR* URL)
{
// TODO: Add your control notification handler code here
UNUSED_ALWAYS(pDisp);
ASSERT(V_VT(URL) == VT_BSTR);

CString strURL(V_BSTR(URL));
strURL.MakeLower();
if(strURL.Find("about.htm")==-1)return;//only apply to about.htm
ReplaceHtmlByID("CompanyName",g_CustomizeInfo.m_strCompanyFullName,TRUE);
ReplaceHtmlByID("ProductName",g_CustomizeInfo.m_strMainWindowCaption,TRUE);
}
weikeming 2001-08-29
  • 打赏
  • 举报
回复
你试一试了,就在控件向导生成的about对话框上加。
绝对不行
蒋晟 2001-08-29
  • 打赏
  • 举报
回复
不会吧,CHtmlView就是自己创建的
weikeming 2001-08-29
  • 打赏
  • 举报
回复
不行,我连create它都要出错,没法创建。
111222 2001-08-29
  • 打赏
  • 举报
回复
CWebBrowser2控件显示和隐藏的问题是这样的:

主  题:如何隐藏和显示控件 -- WebBrowser?
所属论坛:Visual C++


代码如下:
m_pWB=new CWebBrowser2;
m_nWBID = 7000;
m_pWB[i]->Create(NULL,WS_CHILD ¦ WS_VISIBLE,CRect (0,0,500,500),(CWnd *)(&m_tab1),m_nWBID,FALSE);
m_pWB->Navigate("http://www.sina.com.cn/",NULL,NULL,NULL,NULL);

要显示和隐藏m_pWB,采用
m_pWB->SetVisible(false);
m_pWB->SetVisible(true);

m_pWB->ShowWindow(WS_HIDE)
m_pWB->ShowWindow(WS_SHOW)

都不能实现切换


 回复人:111222() (2001-6-7 14:15:00) 得1000000分
WebBrowser控件有BUG
ShowWindow(WS_HIDE);之后控件就被销毁了。
再也显示不出来了:(

原因:

在MFC中,WebBrowser控件动态创建,没有设置WS_VISIBLE 属性 或者 调用了ShowWindow(SW_HIDE);
就会调用IOleControl::DoVerb() ,使WebBrowser控件的实例被销毁。



解决办法:


用SDK的ShowWindow函数。
//隐藏IE控件
::ShowWindow( m_pWB.GetSafeHwnd(), SW_HIDE );

//显示IE控件
::ShowWindow( m_pWB.GetSafeHwnd(), SW_SHOW );

-------------------------------
你尽量全部使用SDK编程吧!
weikeming 2001-08-28
  • 打赏
  • 举报
回复
是ActiveX.
在ActiveX中放了一个无模式dlg,在dlg上放了个Web控件.
web控件通不过IsWindow验证
dandycheung 2001-08-28
  • 打赏
  • 举报
回复
不见得没人会,只不过别人没有这样用过。我在其他情况下使用从来没用过问题。你把你的控件精简到最小,如果有问题给我。
dandycheung 2001-08-28
  • 打赏
  • 举报
回复
不见得没人会,只不过别人没有这样用过。我在其他情况下使用从来没用过问题。你把你的控件精简到最小,如果有问题给我。
weikeming 2001-08-28
  • 打赏
  • 举报
回复
是不是难度有点大?怎么没人会啊?
weikeming 2001-08-28
  • 打赏
  • 举报
回复
加点分,看看有没有高手能解释一下原因。
weikeming 2001-08-28
  • 打赏
  • 举报
回复
再说清楚一些,我在写ax控件,控件中用到了CWebBrowser2,
在使用它的时候,不能通过IsWindow的断言。
最就听说CWebBrowser在show,hide时有bug,是不是也是同一种情况引起的?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧