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

ramile 2004-01-29 02:17:54
如何将TCppWeb中的网页存为文本(用代码)??
...全文
89 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;
}
内容概要:本文详细介绍了图仪器2026年版三坐标测量机ACH100S与ACH100T系列全自动旋转测座的选型规范,重点对比了两者在测量功能、测头连接方式及细分型号间的差异。ACH100T为纯触发型测座,仅支持单点触发测量;而ACH100S为触发/扫描兼容型,支持高精度连续扫描,适用于复杂曲面测量。两类测座均分为标准型(7.5°分度)和精细分度型(-5型,5°分度),后者提供更高空间覆盖率和115°仰角,适应深孔与底切等极限测量场景。文档还提供了系统的三步选型指南:先根据是否需要扫描功能选定系列,再依据工件复杂度选择步幅类型,最后确认安全防护与自动化配置。; 适合人群:从事精密测量、三坐标设备选型的技术人员及企业采购决策者,具备一定机械测量基础知识的专业人员。; 使用场景及目标:①帮助企业准确选配适合自身检测需求的测座型号;②指导在复杂零件(如叶片、齿轮、深孔结构)测量实现高效、无干涉的探测方案;③规划设备长期使用能力,避免因功能局限导致后续升级困难。; 阅读建议:此资源强调功能性与前瞻性的选型思维,建议结合实际测量对象的几何特征和未来检测需求进行对照分析,并重点关注“扫描必要性”和“姿态覆盖能力”两大核心因素。

1,317

社区成员

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

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