TCppWebBrowser 的 C++ 构建器动态 OnDocumentComplete 事件分配

问题描述 投票:0回答:1

我从 1.0 版(1994 年)开始使用 Builder C++。我一直使用它直到 2010 版本。最近我们得到了 IDE 的最后一个版本“Embarcadero® C++Builder 12 Version 29.0.50491.5718”

我过去动态创建了大量对象,没有任何问题,但现在我想升级旧项目,但遇到了无法修复的错误。

我正在尝试动态创建一个 TCppWebBrowser(使用 IDE 效果很好)

我的代码基本上是这样的:

void __fastcall TFormAdmin::CppWebBrowser1DocumentComplete(TObject *Sender, LPDISPATCH pDisp,
          Variant *URL)
{
       //Here the event code
}

在代码的其他部分动态创建对象:

TCppWebBrowser *CppWebBrowser1;
CppWebBrowser1=new TCppWebBrowser(this);
CppWebBrowser1->TOleControl::Parent = this;
CppWebBrowser1->OnDocumentComplete = CppWebBrowser1DocumentComplete;

我收到了下一个错误

CppWebBrowser1->OnDocumentComplete = CppWebBrowser1DocumentComplete;

[bcc32 错误] admin.cpp(78): E2034 无法转换 'void (_fastcall * (_closure )(TObject *,IDispatch *,变体 *))(TObject *,IDispatch *,变体 *)' 到 'TCppWebBrowserDocumentComplete'

当我在 IDE 中使用此代码(在设计时创建并分配对象和事件)时,它工作得很好。

函数原型为:

typedef void __fastcall (__closure * TCppWebBrowserDocumentComplete)(System::TObject * Sender,LPDISPATCH pDisp,VARIANT* URL);

参数相同,类型相同。

我不知道该怎么办。我不明白为什么它在设计时工作而不是以编程方式工作。欢迎任何提示。谢谢。

c++ delphi c++builder c++builder-2010 c++builder-10.2-tokyo
1个回答
0
投票

闭包类型和生成的函数之间似乎存在差异。闭包类型定义为:

typedef void __fastcall (__closure * TCppWebBrowserDocumentComplete)(
    System::TObject * Sender, 
    LPDISPATCH pDisp /*[in]*/, 
    VARIANT* URL /*[in]*/);

但生成的函数使用

Variant
而不是
VARIANT
。这适用于您出于某种原因放入 IDE 中的组件,但不适用于您手动执行的操作。解决方案是更改头文件和
.cpp
文件中的函数签名以匹配:

void __fastcall TForm1::CppWebBrowser1DocumentComplete(
    TObject *Sender, LPDISPATCH pDisp, VARIANT *URL)
{
//                                     ^^^^^^^
© www.soinside.com 2019 - 2024. All rights reserved.