我从 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);
参数相同,类型相同。
我不知道该怎么办。我不明白为什么它在设计时有效,但不能以编程方式工作。
闭包类型和生成的函数之间似乎存在差异。闭包类型定义为:
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) {
// ^^^^^^^
我建议您为此问题编写一个错误报告,以便在以后的版本中修复它。