RAD 10.4中TCppWebBrowser使用问题:C++Builder6代码编译失败求助
修复RAD 10.4 Sydney中TCppWebBrowser加载Stream的编译错误
你这段代码在RAD 10.4中编译失败的核心原因是:新版本里IPersistStreamInit::Load()要求传入IStream*类型指针,但直接传递TStreamAdapter对象不再被编译器接受(C++Builder 6旧版本可能支持隐式转换,新版本已移除该特性)。
以下是修复后的代码:
void __fastcall TRelatPOG::ShowStream(TStream *stm) { try { if (!PogBrowser->Document) { PogBrowser->Navigate(L"about:blank"); // 用常量替代魔法数字4,可读性更强 while (PogBrowser->ReadyState != READYSTATE_COMPLETE) Application->ProcessMessages(); } IPersistStreamInit *psi = nullptr; TStreamAdapter *sa = new TStreamAdapter(stm, soReference); if (sa) { IStream *pStream = nullptr; // 从TStreamAdapter获取标准IStream接口指针 if (SUCCEEDED(sa->QueryInterface(IID_IStream, reinterpret_cast<void**>(&pStream)))) { if (SUCCEEDED(PogBrowser->Document->QueryInterface(IID_IPersistStreamInit, reinterpret_cast<void**>(&psi)))) { psi->InitNew(); psi->Load(pStream); // 传入IStream指针满足API要求 psi->Release(); } pStream->Release(); // 释放获取到的IStream接口 } delete sa; } } catch(Exception *E) { MessageDlg(String(E->ClassName()) + " ( " + E->Message + " )", mtError, TMsgDlgButtons() << mbOK, 0); } }
额外说明:
- 使用
READYSTATE_COMPLETE常量替代原代码中的数字4,符合新版本API规范,代码可读性更高 - 新增从
TStreamAdapter获取IStream接口的步骤,这是RAD 10.4调用IPersistStreamInit::Load()的必要操作 - 所有OLE接口指针都显式调用
Release()释放,避免内存泄漏 - 初始化指针为
nullptr,符合现代C++编码习惯
内容的提问来源于stack exchange,提问作者Jayme Jeffman
相关产品推荐
相关产品推荐

