社区
非技术类
帖子详情
superrg, 分就免了,问题你再看看吧!我也希望能有解决的办法。(知秋一叶)
qqchen79
2002-01-23 12:24:41
http://www.csdn.net/expert/Topic/488/488742.shtm
BTW: 你的分真多呀!:)
...全文
93
7
打赏
收藏
superrg, 分就免了,问题你再看看吧!我也希望能有解决的办法。(知秋一叶)
http://www.csdn.net/expert/Topic/488/488742.shtm BTW: 你的分真多呀!:)
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
superrg
2002-01-24
打赏
举报
回复
但我试过好像用put_URL没有作用,因为只要后来对其内容作过改动,URL就会变成about:blank,这个东东还真不好处理~~~~~~~
superrg
2002-01-23
打赏
举报
回复
程序调试没有问题,速度也很快,唯一美中不足的是:当取Document的URL时,得到的URL是about:blank,按照这个结果推论,利用该Document对其内容进行解释时,Script以及Links都会出现问题。有没有一个简便的方法可以直接设置文档的URL属性而又不会导至文档重新下载的呢????
superrg
2002-01-23
打赏
举报
回复
非常感谢知秋一叶,Let me try again.....(BTW:这种问题出高分不行,不出高分更不行,调通了我一定会送你分的,在这方面你的确是个人才,给你送分,一个字:值~~~~~~~)
qqchen79
2002-01-23
打赏
举报
回复
如果要处理script的话,为什么不用put_URL而要用IStream呢?我觉得使用Stream主要是从File或者内存中直接生成HTML并解析。如果担心put_URL会导致多余的下载的话,可以通过实现IOleClientSite,IDispatch::Invoke,接管DISPID_AMBIENT_DLCONTROL来改变这种行为,这在WalkAll中也是由例子的(只要加上IDispatch/IOleClientSite的实现,并且注意Invoke函数的内容)。
qqchen79
2002-01-23
打赏
举报
回复
1. MSHTML确实需要消息循环,看来它内部还是靠消息机制运行的。
2. IPersistStreamInit ->Load是异步方法,与要实现IPropertyNotifySink ->OnChange来监视Load是否完成。
下面是一个140行的程序,应该够小了:)。从WalkAll变来的。
#include "stdafx.h"
#include <comdef.h>
#include <Atlbase.h>
#include <urlmon.h>
#include <mshtml.h>
#include <iostream>
using namespace std;
#define WM_USER_LOADCOMPLETE ((WM_USER) + 1)
struct MyEventSink : public IPropertyNotifySink
{
CComPtr<IHTMLDocument2> m_pMSHTML;
DWORD m_dwRef;
MyEventSink() :m_pMSHTML(NULL), m_dwRef(0)
{}
HRESULT Init() {
HRESULT hr;
LPCONNECTIONPOINTCONTAINER pCPC = NULL;
hr = m_pMSHTML->QueryInterface(IID_IConnectionPointContainer, (LPVOID*)&pCPC);
LPCONNECTIONPOINT pCP;
hr = pCPC->FindConnectionPoint(IID_IPropertyNotifySink, &pCP);
DWORD dwCookie;
return pCP->Advise((LPUNKNOWN)(IPropertyNotifySink*)this, &dwCookie);
}
STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv)
{
*ppv = NULL;
if (IID_IUnknown == riid || IID_IPropertyNotifySink == riid)
{
*ppv = (LPUNKNOWN)(IPropertyNotifySink*)this;
AddRef();
return NOERROR;
} else {
return E_NOTIMPL;
}
}
STDMETHODIMP_(ULONG) Release()
{
if (--m_dwRef == 0)
{
delete this;
return 0;
}
return m_dwRef;
}
STDMETHODIMP_(ULONG) AddRef()
{
return ++m_dwRef;
}
STDMETHODIMP OnChanged(DISPID dispID)
{
HRESULT hr;
if (DISPID_READYSTATE == dispID)
{
VARIANT vResult = {0};
EXCEPINFO excepInfo;
UINT uArgErr;
DISPPARAMS dp = {NULL, NULL, 0, 0};
if (SUCCEEDED(hr = m_pMSHTML->Invoke(DISPID_READYSTATE, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_PROPERTYGET, &dp, &vResult, &excepInfo, &uArgErr)))
{
READYSTATE lReadyState = (READYSTATE)V_I4(&vResult);
if (lReadyState == READYSTATE_COMPLETE)
{
BOOL fRet = PostThreadMessage(GetCurrentThreadId(),
WM_USER_LOADCOMPLETE,
(WPARAM)0,
(LPARAM)0);
}
VariantClear(&vResult);
}
}
return NOERROR;
}
STDMETHODIMP OnRequestEdit(DISPID dispID)
{
return NOERROR;
}
};
void main()
{
HRESULT hr;
CoInitialize(NULL);
{
CComPtr<IHTMLDocument2> pdoc;
CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_ALL, IID_IHTMLDocument2, (void **)&pdoc);
MyEventSink evtsink;
evtsink.m_pMSHTML = pdoc;
evtsink.Init();
{
CComPtr<IPersistStreamInit> pstr;
hr = pdoc->QueryInterface(IID_IPersistStreamInit, (void **)&pstr);
if(!SUCCEEDED(hr)) cout << "error 2!" << endl;
CComPtr<IStream> pstream;
hr = URLOpenBlockingStream(0, "http://www.msn.com", &pstream, 0, 0);
if(!SUCCEEDED(hr)) cout << "error 1!" << endl;
hr = pstr ->Load(pstream);
if(!SUCCEEDED(hr)) cout << "error 3!" << endl;
}
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
if (WM_USER_LOADCOMPLETE == msg.message && NULL == msg.hwnd)
{
CComPtr<IHTMLElement> pele;
hr = pdoc->get_body((IHTMLElement **)&pele);
if(!SUCCEEDED(hr)) cout << "error 4!" << endl;
BSTR b;
hr = pele ->get_outerHTML(&b);
if(!SUCCEEDED(hr)) cout << "error 5!" << endl;
_bstr_t bt(b, true);
cout << (char *)bt << endl;
PostQuitMessage(0);
}
else
{
DispatchMessage(&msg);
}
}
}
CoUninitialize();
}
superrg
2002-01-23
打赏
举报
回复
http://www.csdn.net/Expert/topic/494/494363.shtm
知秋一叶,请你到上面的地址领分~~~~~
qqchen79
2002-01-23
打赏
举报
回复
有点线索了,你不妨用Spy++看看Host MSHTML的程序,它会包含一个窗口叫IEHide什么的。
看来虽然只是Host了一个COM组件MSHTML,但还是要用消息循环,否则它没法正常工作。
我回写个例子出来试试的。:)
知秋
购物返利网一键返利宝
知秋
购物返利网一键返利宝是一款专为PC用户设计的小型软件工具,主要功能是帮助用户在购物时获取返利。这款应用由个人开发者独立制作,它整合了
知秋
购物返利网的资源,使得用户在进行在线购物时可以更加便捷地享受到...
C# (初入江湖)-几行代码也可以写个电脑屏保
C# (初入江湖)-几行代码也可以写个电脑屏保 ,在下载资源之前可以先看下我的文章,就能更好的了解逻辑思路。 winform 写pc界面程序真的是 YYDS. 里面有Timer控件的使用. 新手学起来也简单易懂,小白一看就能明白。...
浙江自主命题作文公布:以诗歌为话题的作文.doc
"
一叶
落而
知秋
",这句诗暗示了细微变化中蕴含的宏大真理,一片落叶可以揭示季节的更替,体现了诗人敏锐的洞察力和对自然的深刻理解。"一枝红杏出墙来"则展示了生命的活力与春天的
希望
,通过一枝红杏的小小景象,传递...
“立秋”宣传教育课件模板.pptx
诗词中也有许多描写立秋的名句,比如“秋日凉风初至,梧桐
一叶
落
知秋
”,这些诗句生动描绘了立秋时节的景象和情感。在节气文化中,立秋不仅是一个时间标记,更是一种文化传承和生活习俗的体现。 立秋的诗篇反映了...
c#写个小猫猜数,一起玩玩吧,通过小猫猜数来学习数组与字符串的运用
内容概要:通过带着读者手写一个简单的游戏案例,了解 c#的数组与字符串。在手写游戏案例的过程中学会数组在实际开发过程中的运用,字符的运用方式。...同时也可关注我的WX 公众号:程序猿
知秋
,还有更多的精典案例
非技术类
1,658
社区成员
58,949
社区内容
发帖
与我相关
我的任务
非技术类
VC/MFC 非技术类
复制链接
扫一扫
分享
社区描述
VC/MFC 非技术类
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章