admin';?>

首页 / 开发交流

js,c++如何互相调用

By admin •  2018-09-25 10:46:41 •  51次点击
c++ call js:
c++ can invoke js directly, and get  string value, which come from js.
bool CMozUtil::InjectJS(nsIDOMWindow* dom, const wchar_t* userScript, char* result)
{
	nsresult rv;

	nsCOMPtr<nsPIDOMWindowOuter> piWin(do_QueryInterface(dom));
	nsCOMPtr<nsIScriptGlobalObject> innerGlobal = do_QueryInterface(piWin);
	nsIDocShell* docShell = piWin->GetDocShell();
	nsCOMPtr<nsIScriptGlobalObject> global(do_GetInterface(docShell));
	
	nsCOMPtr<nsIScriptContext> scriptContext = global->GetContext(); 
	JSObject* jb = scriptContext->GetWindowProxy();
	nsCOMPtr<nsIXPConnect> xpc = do_GetService("@mozilla.org/js/xpc/XPConnect;1");

	mozilla::dom::AutoJSAPI jsapi;
	jsapi.Init();
	JSContext* cx = jsapi.cx();

	JS::Rooted<JSObject*> globalJSObject(cx, innerGlobal->GetGlobalJSObject());
	JSAutoNullableCompartment ac(cx, globalJSObject);

	JS::CompileOptions opts(cx);
	opts.setNoScriptRval(true)
		.setVersion(JSVERSION_LATEST);
	 
	opts.setFileAndLine("ohui", 0);
	opts.setFileAndLine("-e", 1);
	opts.setNoScriptRval(false);

	JS::Rooted<JS::Value> v(cx, JS::UndefinedValue());
	bool bSucc = JS::Evaluate(cx
					    , opts
					    , (const char16_t*)userScript 
					    , wcslen(userScript)
					    , &v);

	if (result && v.isString() && !v.isObject())
	{
		JSString* str = v.toString();
		size_t aLen = JS_GetStringLength(str);

		JS_EncodeStringToBuffer(cx, str, result, aLen);
		result[aLen] = 0;
	}

	return NS_SUCCEEDED(rv);
}


SendToJs():
void CMainFrame::SendToJs()
{ 
	nsIWebBrowserChrome *chrome = 0;
	if (m_pBrowserWrapper && m_pBrowserWrapper->mWebBrowser)
		m_pBrowserWrapper->mWebBrowser->GetContainerWindow(&chrome);

	if (chrome)
		CMozUtil::InjectJS(chrome, m_pCommandData);
}

js call c++:

我们通过g_xpConn这个对象向js暴露调用接口。g_xpConn是一个xpcom组件。我们通过如下方法来引用该组件。

既然是xpcom,肯定是可以用c++来开发了。这样就完成了js对c++的调用。
xpcom组件开发其实就类似于开发dll,具体开发方法及源码工程大家可以观看这里:
xpcom组件开发及demo: http://bbs.otherhill.com/index.php/topic/show/40


0 回复 | 直到2018-11-19 06:25添加回复

回复

登录发表 or 还没有账号?去注册

他山跨平台混合应用开发框架

现在注册 已注册请 登入

节点列表

产品发布

Windows  Linux  Android  最新进展 

经验交流

功能建议  Windows  Linux  Android  开发交流  资源分享  js  xul 

BUG反馈

Windows  Linux  Android 

学习生活

灌水乐园  大话界面