我想用CEF4构建测试应用程序。我已成功将CEF4Delphi(github.com/salvadordf/CEF4Delphi)组件安装到C ++ Builder中。而且我想在C ++ Builder中构建JSExtension delphi演示项目。
我正在尝试将函数设置为成员,但是每次都会遇到相同的错误:
[bcc32错误] Unit1.cpp(35):必须调用E2235成员函数或获取其地址
我都尝试过:
<ng-template [ngIf]="(obs | async) as result">
{{result}}
</ng-template>
如何正确执行此操作?
我在C ++ Builder中使用CEF4Delphi(github.com/salvadordf/CEF4Delphi)组件。在delphi JSExtension演示项目上,它运行良好,但是我无法构建同一演示的C ++版本。 C ++使用delphi接口,我不知道如何正确使用它。我需要将我的功能分配给GlobalCEFApp-> OnWebKitInitialized =的成员函数。
答案 0 :(得分:3)
成员函数必须符合它们所在的类。
因此,您需要使用&TheClassOfTheFunction::GlobalCEFApp_OnWebKitInitialized
。
答案 1 :(得分:2)
TCefApplication::OnWebKitInitialized
事件被声明为使用TOnWebKitInitializedEvent
类型,该类型在uCEFInterfaces.pas
单元中声明为:
TOnWebKitInitializedEvent = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure() {$IFNDEF DELPHI12_UP}of object{$ENDIF};
CEF在Delphi / C ++ Builder 2009及更高版本中定义了DELPHI12_UP
。
您没有说您正在使用哪个版本的C ++ Builder。
如果您使用的是C ++ Builder 2007或更早版本,则OnWebKitInitialized
事件需要一个指向非静态类方法的指针。
如果您使用的是C ++ Builder 2009+,则OnWebKitInitialized
事件期望使用anonymous method。
由于您提到尝试使用_di_TOnWebKitInitializedEvent
(仅当TOnWebKitInitializedEvent
是匿名方法类型时才存在),因此我不得不假设您正在使用C ++ Builder 2009 +。
在C ++中,Delphi风格的匿名方法需要特殊处理,Embarcadero已证明:
How to Handle Delphi Anonymous Methods in C++
您需要包装GlobalCEFApp_OnWebKitInitialized()
才能将其用作匿名事件处理程序。为此,根据使用的是经典的Borland Win32 / OSX编译器还是更新的Clang-based compilers之一,您有两种选择。
经典:您必须编写一个实现TOnWebKitInitializedEvent
接口的函子:
class TWebKitInitRef : public TCppInterfacedObject<TOnWebKitInitializedEvent>
{
public:
INTFOBJECT_IMPL_IUNKNOWN(TInterfacedObject);
void __fastcall Invoke() { GlobalCEFApp_OnWebKitInitialized(); }
};
GlobalCEFApp->OnWebKitInitialized = _di_TOnWebKitInitializedEvent(new TWebKitInitRef());
Clang :您可以使用C ++ lambda:
GlobalCEFApp->OnWebKitInitialized = [](){ GlobalCEFApp_OnWebKitInitialized(); };