TCppWebBrowser 的动态 OnDocumentComplete 事件分配中的 C++Builder 12 错误

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

我从 1.0 版(1994 年)开始使用 C++Builder。我一直使用到 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 *,Variant *))(TObject *,IDispatch *,Variant *)' 转换为 '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个回答
2
投票

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

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

但生成的函数使用

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

class TForm1 : public TForm
{
    void __fastcall CppWebBrowser1DocumentComplete(
        TObject *Sender, LPDISPATCH pDisp, VARIANT *URL);
//                                         ^^^^^^^
void __fastcall TForm1::CppWebBrowser1DocumentComplete(
    TObject *Sender, LPDISPATCH pDisp, VARIANT *URL) {
//                                     ^^^^^^^

我建议您为此问题编写一个错误报告,以便在以后的版本中修复它。

© www.soinside.com 2019 - 2024. All rights reserved.