to ThinkX(思考中)你写的那个模板实在太好了。再送200分。不然我不爽!!

pp616 2003-03-02 02:46:29
如题
...全文
57 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
rikky 2003-03-02
  • 打赏
  • 举报
回复
哈哈,贪心的人不少啊,多我一个不多啊
halibut 2003-03-02
  • 打赏
  • 举报
回复
让我拿点分吧!
RomanticProgrammer 2003-03-02
  • 打赏
  • 举报
回复
算我求你了总可以了吧....
RomanticProgrammer 2003-03-02
  • 打赏
  • 举报
回复
给我2分好吗?


我很可怜的...
invalid 2003-03-02
  • 打赏
  • 举报
回复
什么模版啊?
youer511 2003-03-02
  • 打赏
  • 举报
回复
我们也有吗?
那我就不拿白不拿了
pp616 2003-03-02
  • 打赏
  • 举报
回复
template代码
#include <vector>
#include "mshtml.h"


//可以清空由Com指针作为元素的stl容器的函数,如vector<IUnknown>, list<IHTMLElement>
template <class T>
void ClearInterface(T& v)
{
//遍历容器,然后Release其中的元素
for (T::iterator iter = v.begin(); iter != v.end(); ++iter)
{
if (*iter)
{
(*iter)->Release();
(*iter) = NULL;
}
}

v.clear();
}

//这是一个过滤Html元素的类,可以做为基类使用,
//其中只有一个函数Filter,如果它
//返回true,则将一个html元素加入到队列中,否则不加入
template <class T>
class HtmlElementFilter
{
public:
inline HtmlElementFilter() { }
virtual ~HtmlElementFilter() { }
virtual bool Filter(T*) { return true; }
};

//一个例子,用继承的方法使用HtmlElementFilter
template <class T>
class SimpleFilter : public HtmlElementFilter<T>
{
public:
inline SimpleFilter() { }
virtual ~SimpleFilter() { }
virtual bool Filter(T*) { return true; }
};

//另一个例子,用模板特化的方法使用HtmlElementFilter
//这个类可以过滤Anchor元素
template < >
class HtmlElementFilter<IHTMLAnchorElement>
{
public:
inline HtmlElementFilter() { }
virtual ~HtmlElementFilter() { }
virtual bool Filter(IHTMLAnchorElement*) { return true; }
};

//这个函数可以得到页面中某一个类型的元素集合,
//htmlDoc是html的IDispatch指针,可以用CppWebBrowser1->Document作为参数
//elements是返回的页面元素的集合
//filter就是上面介绍的过滤器,默认为NULL,不进行过滤
template <class T>
void GetHtmlElements(IDispatch* htmlDoc, //[in]
std::vector<T*>& elements, //[out]
HtmlElementFilter<T>* filter = 0 //[in]
)
{
if (htmlDoc == NULL) return;

//清空元素集合
ClearInterface(elements);

HRESULT hr;

//得到IHTMLDocument2的接口指针
IHTMLDocument2* hdoc2;
hr = htmlDoc->QueryInterface(__uuidof(IHTMLDocument2), (void**)&hdoc2);
if (SUCCEEDED(hr))
{
//得到元素集合
IHTMLElementCollection* hec;
hr = hdoc2->get_all(&hec);
if (SUCCEEDED(hr))
{
//得到元素集合的枚举器
IUnknown* unk1;
hr = hec->get__newEnum(&unk1);
if (SUCCEEDED(hr))
{
IEnumVARIANT* enumVar;
hr = unk1->QueryInterface(__uuidof(IEnumVARIANT), (void**)&enumVar);
if (SUCCEEDED(hr))
{
VARIANT elemVar;

//进行枚举
T* elem;
while (enumVar->Next(1, &elemVar, NULL) == S_OK)
{
//assert(elemVar.vt == VT_DISPATCH); //最好断言一下

//请求相应的元素,如果请求不成功,说明不是要求种类的元素
elemVar.pdispVal->QueryInterface(__uuidof(T), (void**)&elem);
if (SUCCEEDED(hr) && elem != NULL)
{
//过滤
if (filter)
{
if (filter->Filter(elem))
elements.push_back(elem);
else
elem->Release();
}
else
elements.push_back(elem);
}

VariantClear(&elemVar);
}

enumVar->Release();
}

unk1->Release();
}

hec->Release();
}

hdoc2->Release();
}
}

//=================
ThinkX 2003-03-02
  • 打赏
  • 举报
回复
对了:你不说我还忘了,那段代码有个漏洞,补上:
将GetHtmlElements函数中的

if (filter->Filter(elem))
elements.push_back(elem);

改为
if (filter->Filter(elem))
elements.push_back(elem);
else
elem->Release();

另外:
我感觉写一个通过element name/id 和index 进行过滤的Fliter是很用用的。
rh 2003-03-02
  • 打赏
  • 举报
回复
俺不要分,俺想看看那模版...
ThinkX 2003-03-02
  • 打赏
  • 举报
回复
谢谢 pp616
接分!!
myy 2003-03-02
  • 打赏
  • 举报
回复
蹭蹭蹭!
yeahchang 2003-03-02
  • 打赏
  • 举报
回复
就是就是
qdxby 2003-03-02
  • 打赏
  • 举报
回复
把摸班贴出来看看啊。
favorit 2003-03-02
  • 打赏
  • 举报
回复
binbin(俺又回来了(俺不是南霸天)...)说的,就是偶想说的

……………
everlasting 2003-03-02
  • 打赏
  • 举报
回复
什么模板?
binbin 2003-03-02
  • 打赏
  • 举报
回复
双星的家伙也来蹭分啊.
还是给俺几分吧.俺一个月没进帐了.
chinayang 2003-03-02
  • 打赏
  • 举报
回复
多关照关照..我们最底层的农民阶级吧

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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