社区
非技术类
帖子详情
superrg, 分就免了,问题你再看看吧!我也希望能有解决的办法。(知秋一叶)
qqchen79
2002-01-23 12:24:41
http://www.csdn.net/expert/Topic/488/488742.shtm
BTW: 你的分真多呀!:)
...全文
103
7
打赏
收藏
superrg, 分就免了,问题你再看看吧!我也希望能有解决的办法。(知秋一叶)
http://www.csdn.net/expert/Topic/488/488742.shtm BTW: 你的分真多呀!:)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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应用程序。由于没有向某个网络安全公司交钱,因此会被屏蔽,目前只支持IE浏览器。安装时会修改右键的快捷方式,所以会报恶意程序,选择允许即可。请大家放心使用,绝对无毒,无木马。
C# (初入江湖)-几行代码也可以写个电脑屏保
C# (初入江湖)-几行代码也可以写个电脑屏保 ,在下载资源之前可以先看下我的文章,就能更好的了解逻辑思路。 winform 写pc界面程序真的是 YYDS. 里面有Timer控件的使用. 新手学起来也简单易懂,小白一看就能明白。 不懂的可以留言,或在微信公众号(程序猿
知秋
)中查看更详细的内容。 还有更多的案例哦!!!!!!!!!!!!!!!!!!
浙江自主命题作文公布:以诗歌为话题的作文.doc
浙江自主命题作文公布:以诗歌为话题的作文.doc
“立秋”宣传教育课件模板.pptx
“立秋”宣传教育课件模板
c#写个小猫猜数,一起玩玩吧,通过小猫猜数来学习数组与字符串的运用
内容概要:通过带着读者手写一个简单的游戏案例,了解 c#的数组与字符串。在手写游戏案例的过程中学会数组在实际开发过程中的运用,字符的运用方式。同时读者在写的过程中也可以思考如何将程序可以更精简,运行效率更高。 适合人群:编程小白,对c#程序感兴趣,喜欢图形化程序 能学到什么:数组的原理及在实际开发中的运用,加深印象。 字符串在实际中的运用 阅读建议:此资源是我发表的同名文章的案例,所以在学习的过程要结合文章的内容,尝试自己去编写调式程序,收获会更多。同时也可关注我的WX 公众号:程序猿
知秋
,还有更多的精典案例
非技术类
1,660
社区成员
58,949
社区内容
发帖
与我相关
我的任务
非技术类
VC/MFC 非技术类
复制链接
扫一扫
分享
社区描述
VC/MFC 非技术类
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章