我想使用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(); };