gpt4 book ai didi

javascript - Awesomium 是否允许我在 JS 中调用/使用 C++ 变量/方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:03 24 4
gpt4 key购买 nike

Awesomium 很容易允许 C++ 代码调用 Javascript 方法,但我还没有找到关于它是否可以做相反事情的明确答案。 This site似乎说可以,但是查看文本和示例并没有启发我。

所以,我正在寻找一个明确的答案:我能否在我的 Javascript(Jquery) 中调用 C++ 变量/方法?

如果您能提供一个简单的示例,我们将不胜感激。

谢谢!

最佳答案

你绝对可以——你只需要使用委托(delegate)/函数指针在 WebView::setObjectCallback 和 WebViewListener::onCallback 之上构建一个额外的层。

我编写了一个快速的 JSDelegate.h 类 ( view it here ),您可以使用它来将“onCallback”事件直接连接到 C++ 成员函数。

基本思想是维护回调名称到委托(delegate)的映射:

typedef std::map<std::wstring, Awesomium::JSDelegate> DelegateMap;
DelegateMap _delegateMap;

并从您的 WebViewListener::onCallback 调用相应的函数:

void MyListener::onCallback(Awesomium::WebView* caller, const std::wstring& objectName, 
const std::wstring& callbackName, const Awesomium::JSArguments& args)
{
DelegateMap::iterator i = _delegateMap.find(callbackName);

if(i != _delegateMap.end())
i->second(caller, args);
}

然后,每次您希望绑定(bind)一个特定的 C++ 函数时,您可以这样做:

// Member function we wish to bind, must have this signature for JSDelegate
void MyClass::myFunction(Awesomium::WebView* caller, const Awesomium::JSArguments& args)
{
// handle args here
}

// Instantiate MyClass instance in C++
MyClass* myClass = new MyClass();

// Create corresponding 'MyClass' object in Javascript
webView->createObject(L"MyClass");

// Do the following for each member function:
// Bind MyClass::myFunction delegate to MyClass.myFunction in JS
_delegateMap[L"myFunction"] = Awesomium::JSDelegate(myClass, &MyClass::myFunction);
webView->setObjectCallback(L"MyClass", L"myFunction");

然后,您应该能够像这样直接从 Javascript 调用 MyClass::myFunction:

MyClass.myFunction("foo", 1, 2 3)

希望对您有所帮助!我没有测试任何代码,但我用 Awesomium v1.6 RC4 SDK 编写了它记在心里。

关于javascript - Awesomium 是否允许我在 JS 中调用/使用 C++ 变量/方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5553734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com