gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:21:54 26 4
gpt4 key购买 nike

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

此代码需要从 WebAssembly 模块启动,因此用户不能注入(inject)与真实值不同的值。

最佳答案

解释

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

快速解决方案

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

#include <iostream>
#include <emscripten.h>

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

我们编译上面的 example.cpp带有 Emscripten compiler 的代码如下:

emcc example.cpp -o example.html

输出是嵌入了 int main() 的网页里面有 JS 代码的函数(真的,inception)。
要在允许跨域资源共享 (CORS) 的同时运行代码,我们将使用 emrun工具(我无法在 Firefox 上运行该示例,因此我使用了 Chrome):

emrun --browser chrome example.html

评论

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

关于javascript - 如何从 WebAssembly 模块中检测浏览器信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59790919/

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