首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用函数地址C++ Builder设置成员GlobalCEFApp->OnWebKitInitialized

使用函数地址C++ Builder设置成员GlobalCEFApp->OnWebKitInitialized
EN

Stack Overflow用户
提问于 2019-03-22 12:46:32
回答 2查看 453关注 0票数 0

我想用C++ 4构建一个测试应用程序。我已经成功地将CEF4Delphi (github.com/salvadordf/CEF4Delphi)组件安装到了C++ Builder上。我想在JSExtension Builder中构建C++ delphi演示项目。

我试图为一个成员设置一个函数,但是每次都有一个相同的错误:

bcc32错误单位: its (35):必须调用E2235成员函数或取其地址

我都试过了:

代码语言:javascript
复制
//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 =的成员函数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-22 17:25:37

TCefApplication::OnWebKitInitialized事件被声明为使用TOnWebKitInitializedEvent类型,该类型在uCEFInterfaces.pas单元中声明为:

代码语言:javascript
复制
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事件需要一个匿名方法

由于您提到尝试使用_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());
  • Clang:您可以使用C++ lambda: GlobalCEFApp->OnWebKitInitialized = { GlobalCEFApp_OnWebKitInitialized();};
票数 1
EN

Stack Overflow用户

发布于 2019-03-22 13:00:02

成员函数必须使用它们所在的类进行限定。

所以您需要使用&TheClassOfTheFunction::GlobalCEFApp_OnWebKitInitialized

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55299951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档