设置成员GlobalCEFApp-> OnWebKitInitialized与函数地址C ++ Builder

时间:2019-03-22 12:46:33

标签: c++ delphi c++builder chromium-embedded cef4delphi

我想用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 =的成员函数。

2 个答案:

答案 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(); };