我想用C++ 4构建一个测试应用程序。我已经成功地将CEF4Delphi (github.com/salvadordf/CEF4Delphi)组件安装到了C++ Builder上。我想在JSExtension Builder中构建C++ delphi演示项目。
我试图为一个成员设置一个函数,但是每次都有一个相同的错误:
bcc32错误单位: its (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; 如何正确地做到这一点?
我在CEF4Delphi Builder中使用了C++ (github.com/salvadordf/CEF4Delphi)组件。在delphi JSExtension演示项目上,它工作得很好,但我不能构建同一个演示的C++版本。C++使用delphi接口,我不知道如何正确使用它。我需要将我的函数分配给GlobalCEFApp->OnWebKitInitialized =的成员函数?
发布于 2019-03-22 17:25:37
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。
OnWebKitInitialized事件需要指向非静态类方法的指针。OnWebKitInitialized事件需要一个匿名方法。由于您提到尝试使用_di_TOnWebKitInitializedEvent (只有在TOnWebKitInitializedEvent是匿名方法类型时才存在),我必须假设您使用的是C++Builder 2009+。
在C++中,Delphi风格的匿名方法需要特殊处理,Embarcadero已经证明了这一点:
如何在C++中处理Delphi匿名方法
您需要包装GlobalCEFApp_OnWebKitInitialized(),以便将它用作匿名事件处理程序。要做到这一点,您有两个选择,取决于您是使用经典的Borland 32/OSX编译器还是使用更新的基于Clang的编译器之一。
TOnWebKitInitializedEvent接口的函子:
类TWebKitInitRef : public TCppInterfacedObject { public: INTFOBJECT_IMPL_IUNKNOWN(TInterfacedObject);void (){ GlobalCEFApp_OnWebKitInitialized();};GlobalCEFApp->OnWebKitInitialized =_di_TOnWebKitInitializedEvent(新的TWebKitInitRef());发布于 2019-03-22 13:00:02
成员函数必须使用它们所在的类进行限定。
所以您需要使用&TheClassOfTheFunction::GlobalCEFApp_OnWebKitInitialized。
https://stackoverflow.com/questions/55299951
复制相似问题