首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从WebAssembly模块中检测浏览器信息?

如何从WebAssembly模块中检测浏览器信息?
EN

Stack Overflow用户
提问于 2020-01-18 00:05:32
回答 1查看 477关注 0票数 1

如何从启动时通过JavaScript检测到的值初始化C++变量(编译为WebAssembly) (如当前screen.availWidth)?

这段代码需要从WebAssembly模块启动,因此用户不能注入与实际值不同的值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-28 19:35:02

解释

您可以从C++函数内部运行JavaScript代码。这样的JS代码可以访问您在web浏览器中运行时通常可以访问的所有对象。为此,我们将使用EM_ASM_INT宏来执行返回int值的JS代码。

快速解决方案

我们将JS代码注入到C++代码example.cpp中。使用int main()函数可以确保代码在加载页面时自动执行,而不需要手动加载WebAssembly模块。但是,您可以使用不同的函数,导出它,并在您的网页上执行它。

代码语言:javascript
复制
#include <iostream>
#include <emscripten.h>

int main()
{
   int screen_width = EM_ASM_INT(
       return screen.availWidth;);
   std::cout << "Screen width=" << screen_width << std::endl;
}

我们使用Emscripten compiler编译上面的example.cpp代码,如下所示:

代码语言:javascript
复制
emcc example.cpp -o example.html

输出的是一个嵌入了JS代码的int main()函数的网页(真的是inception)。为了在允许跨域资源共享(CORS)的同时运行代码,我们将使用emrun工具(我无法在火狐上运行示例,所以我使用Chrome ):

代码语言:javascript
复制
emrun --browser chrome example.html

评论

此方法适用于返回值为标量int类型(使用EM_ASM_INT)、double类型(使用EM_ASM_DOUBLE),但返回值为char*数组的JS代码(使用EM_ASM_INT并仔细手动进行内存管理,如here所示)。

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

https://stackoverflow.com/questions/59790919

复制
相关文章

相似问题

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