我从 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);
参数相同,类型相同。
我不知道该怎么办。我不明白为什么它在设计时工作而不是以编程方式工作。欢迎任何提示。谢谢。
闭包类型和生成的函数之间似乎存在差异。闭包类型定义为:
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)
{
// ^^^^^^^