如何在RAD 10.4上使用TCPWebBrowser



下面的代码曾经非常适合C++Builder 6.0,但它不是在RAD 10.4 Sydney上编译的。我不熟悉OLE控件及其类和方法。有人能帮我把它做好吗?

PogBrowser是一个TCPWebBrowser。

void __fastcall TRelatPOG::ShowStream( TStream *stm )
{
try
{
if( !PogBrowser->Document )
{
PogBrowser->Navigate(L"about:blank");
while( PogBrowser->ReadyState != 4 )         
Application->ProcessMessages();
}
IPersistStreamInit *psi;
TStreamAdapter *sa = new   TStreamAdapter(stm,soReference);
if( sa )
{
if (SUCCEEDED(PogBrowser->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi)))
{
psi->InitNew();
psi->Load(*sa);// Compile error
psi->Release();
}
delete sa;
}
}
catch(Exception *E)
{
MessageDlg(String(E->ClassName()) + " ( " + E->Message + " )", mtError, TMsgDlgButtons() << mbOK, 0);
}
}

从前,TStreamAdapter隐式转换为IStream*,但现在它隐式转换成_di_IStream(即DelphiInterface<IStream>(。

IPersistStreamInit::Save()需要IStream*,因此需要2个转换(TStreamAdapter->_di_IStream->IStream*(,但C++一次只允许1个隐式转换。

因此,您需要显式地将TStreamAdapter强制转换为_di_IStream,然后它可以隐式地转换为IStream*,例如:

psi->Load(static_cast<_di_IStream>(*sa));

然而,更好的解决方案是让_di_IStream处理TStreamAdapter的寿命,例如:

_di_IPersistStreamInit psi;
if (SUCCEEDED(PogBrowser->Document->QueryInterface(IID_IPersistStreamInit, reinterpret_cast<void**>(&psi))))
{
_di_IStream sa(*(new TStreamAdapter(stm, soReference)));
psi->InitNew();
psi->Load(sa);
}

最新更新