如何将TCppWeb中的网页存为文本(用代码)??

ramile 2004-01-29 02:17:54
如何将TCppWeb中的网页存为文本(用代码)??
...全文
84 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Friecin 2004-01-30
  • 打赏
  • 举报
回复
郁于IE控件的限制,有生成临时文件...
void __fastcall TfrmMain::Button1Click(TObject *Sender)
{
IHTMLDocument2* HTMLDocument = NULL;
IPersistFile* PersistFile = NULL;
if(!CppWebBrowser->Busy && CppWebBrowser->Document &&
AnsiString(CppWebBrowser->LocationURL) != "about:blank" &&
SUCCEEDED(CppWebBrowser->Document->QueryInterface(
IID_IHTMLDocument2, (LPVOID*)&HTMLDocument)))
{
// 保存网页文档
if(SUCCEEDED(HTMLDocument->QueryInterface(IID_IPersistFile,
(LPVOID*)&PersistFile)))
{

AnsiString TempFile = ExtractFilePath(ParamStr(0))+
"0000html_temp";
PersistFile->Save(WideString(TempFile), false);
PersistFile->Release();

TMemoryStream* pStream = new TMemoryStream;
if(pStream)
{
// 将所有的临时文件内容读入TStrings,并显示
if(FileExists(TempFile))
{
pStream->LoadFromFile(TempFile);
// DataModule->WriteBlob(pStream);
DeleteFile(TempFile);
}
}
delete pStream;
}
}
}
//---------------------------------------------------------------------------
void __fastcall DataModule::WriteBlob(const TMemoryStream* pStream)
{
pQuery->Edit();
TBlobField * pField=(TBlobField *)pQuery->FieldByName("HTML_FIELD");
TBlobStream * pmem=new TBlobStream(pField,bmWrite);
pmem->Seek(0,soFromBeginning);
pStream->SaveToStream(pmem);
delete pmem;
pQuery->Post();
}
上面的代码写得真得很好

方法二:
方法2:
不生成临时文件,但由于CppWebBrowser的一个Bug,const int Size = 0x100000;只能预先指定,虽然也可以透过IHTMLDocument来取得大致的大小,呵呵太麻烦了....
10000不够用自己放大呗....
//---------------------------------------------------------------------------
void GetHtmlSourceFromWebBrowser( TCppWebBrowser *WebBrowser,TMemoryStream* pMemoryStream )
{
IStream *pIStream;
HGLOBAL hGlobal;
IPersistStreamInit *psi;

const int Size = 0x100000;

if( WebBrowser->Document == NULL )
return;

hGlobal = GlobalAlloc( GPTR, Size );
if ( 0 == hGlobal )
{
ShowMessage( "GlobalAlloc Error" );
return;
}

OleCheck( CreateStreamOnHGlobal( hGlobal, true, &pIStream ) );
try
{
OleCheck( WebBrowser->Document->QueryInterface( __uuidof(IPersistStreamInit), (void **)&psi ) );
try
{
OleCheck( psi->Save(pIStream,false) );

pMemoryStream->SetSize(Size);
CopyMemory( pMemoryStream->Memory, hGlobal, Size);

}
__finally
{
delete psi;
}
}
__finally
{
delete pIStream;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{

TMemoryStream* pStream = new TMemoryStream();

GetHtmlSourceFromWebBrowser(CppWebBrowser1, pStream);

DataModule->WriteBlob(pStream);

if(pStream) delete pStream;
}
//---------------------------------------------------------------------------
他开辟了很大的内存,用于保存流,下面是msdn上的IPersistStreamInit定义
interface IPersistStream : IPersist {
//IUnknown members and GetClassID from IPersist
HRESULT IsDirty(void);
HRESULT Load(IStream *pStm);
HRESULT Save(IStream *pStm, BOOL fClearDirty);
HRESULT GetSizeMax(ULARGE_INTEGER *pcbSize); };
interface IPersistStreamInit : IPersist { HRESULT InitNew(void); };
这里涌到的save如下
Instructs the object to save its persistent data at the current seek offset of the given stream. The object must save its data and return without holding the IStream pointer. The fClearDirty argument tells the object whether it should consider itself clean after this call-a client may be making a copy of the object as opposed to saving its data permanently, and this flag distinguishes the cases.


方法三:

void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender,
LPDISPATCH pDisp, Variant *URL)
{
//为了保证同步,应该把获取Document内容的代码放到OnDocumentComplete事件
IHTMLDocument2 *document;
IHTMLElement *body;
BSTR title,source,content;

(void *)document=CppWebBrowser1->Document;

document->get_title(&title);
document->get_body(&body);
body->get_outerHTML(&source);
body->get_outerText(&content);

Edit1->Text=title;
Edit2->Text=*URL;
Memo1->Text=source;
Memo2->Text=content;

TMemoryStream* pms = new TMemoryStream();
TStringStream* pss = new TStringStream(AnsiString(source));
pms->CopyFrom(pss,pss->Size);

// WriteToDB(pms);

delete pms,pss;

}
freshman2003 2004-01-29
  • 打赏
  • 举报
回复
本文来自FAQ。
把Get()放在 CppWebBrowser1的OnDocumentComplete()中。
bool __fastcall TForm1::Get(void)
{
IHTMLDocument2 *pDoc=NULL;
IHTMLElement *body;
LPDISPATCH pDisp = NULL;
pDisp =CppWebBrowser1->Document;
if(pDisp)
{
if (SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc)))
{
pDisp->Release();
wchar_t *txt;
pDoc->get_body(&body);
body->get_outerText(&txt);
pDoc->Release();
body->Release();
Memo1->Text=txt;
return true;
}
}
return false;
}
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 QNAP 301w 免拆刷机方法 特别感谢 @coolsnowwolf @asushugo 等一众牛B的开发者适配301w路由器! QNAP QHora-301W 产品介绍 当前促销:https://www.materiel.net/produit/202011090007.html?offerId=AR202011090007 一. 开启SSH服务 在开启路由器可以正常进系统的状态下,长按路由器后的 WPS 键,直到听到第二声“嘟”松开(大约 12 秒)就 OK。 -- 二. SSH连接路由器后台 这里需要注意一点 路由器默认开启的SSH的端口号是 22200 用户名是,密码是路由器网页登录密码 ssh命令就是 ( 如果端口没开重复步骤1 ) 或者使用putty连接 putty -- 三. 将启动分区切换到第二分区 提示要输入的密码就是刚刚你登录 ssh 的密码,以下不再赘述 重启 -- 四. 检查路由器当前启动分区 查看分区,确保这里会输出 1,如果不是,重复步骤 三。 -- 五. 使用 Winscp 上传QSDK的 kernel.bin 和 rootfs.bin 到 /tmp (! 别问我固件从哪儿拿) -- 六. 将QSDK到dd刷入第一分区 注意:强烈建议使用dd命令(方法自行搜索引擎)备份一些重要的分区例如mtd闪存分区以及mmc闪存分区,以便以后可以恢复官方固件 截图参考: putty 执行完上述命令之后即可刷入QSDK并从第一分区启动QSDK,注意由于目前还没有刷10G PHY的firmware,需刷入firmware。 -- 七. 刷入 10G PHY 的 fi...

1,317

社区成员

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

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