设置成员 GlobalCEFApp->OnWebKit使用函数地址初始化 C++生成器



我想使用cef4.i构建一个测试应用程序,我已经安装了cef4delphi(github.com/salvadordf/cef4delphi)组件,以成功。我想在C 构建器中构建jsextension delphi演示项目。

我正在尝试将功能设置为成员,但是每次都会出现相同的错误:

[BCC32错误] unit1.cpp(35):E2235必须调用成员函数或接收地址

我尝试了所有这些:

//This is my function, just a global function
void GlobalCEFApp_OnWebKitInitialized();
//For GlobalCEFApp object I want to assign my function to a member function OnWebKitInitialized of that object 
 GlobalCEFApp = new TCefApplication();

// I tried this:
GlobalCEFApp->OnWebKitInitialized = GlobalCEFApp_OnWebKitInitialized;
GlobalCEFApp->OnWebKitInitialized = &GlobalCEFApp_OnWebKitInitialized;
GlobalCEFApp->OnWebKitInitialized = (_di_TOnWebKitInitializedEvent*)GlobalCEFApp_OnWebKitInitialized;
GlobalCEFApp->OnWebKitInitialized = reinterpret_cast<TOnWebKitInitializedEvent &>(GlobalCEFApp_OnWebKitInitialized);
//But only this compiled, however it gives access violation at runtime
GlobalCEFApp->OnWebKitInitialized = ( _di_TOnWebKitInitializedEvent &)GlobalCEFApp_OnWebKitInitialized; 

如何正确执行操作?

我在C 构建器中使用CEF4Delphi(github.com/salvadordf/cef4delphi)组件。在Delphi jsextension演示项目上,它运行良好,但是我无法构建同一演示的C 版本。C 使用Delphi接口,我不知道如何正确使用它。我需要将我的函数分配给globalcefapp-> onwebkitinitialized =?

成员功能必须与他们所在的类合格。

因此您需要使用&TheClassOfTheFunction::GlobalCEFApp_OnWebKitInitialized

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 构建器。

  • 如果您使用的是C 建筑商2007或更早,则OnWebKitInitialized事件期望指向非静态类方法

  • 如果您使用的是C 建造者2009 ,则OnWebKitInitialized事件期望匿名方法而不是。

由于您提到使用_di_TOnWebKitInitializedEvent尝试使用TOnWebKitInitializedEvent是一种匿名方法类型,因此我必须假设您正在使用C 建造者2009 。

在C 中,Delphi风格的匿名方法需要特殊处理,Embarcadero已记录了:

如何处理C 中的Delphi匿名方法

您需要包装GlobalCEFApp_OnWebKitInitialized()才能将其用作匿名活动处理程序。为此,您可以选择几个选择,具体取决于您是使用经典的Borland Win32/OSX编译器还是新的基于Clang的编译器之一。

  • 经典:您必须写一个实现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(); };
    

最新更新