首页 > 解决方案 > 如何在c++(webassembly)函数中将字符串作为文件作为javascript的参数发送?

问题描述

我在 C++ 中有一个函数,它将文件作为主函数中的参数。

int main(int argc, char **argv) {
    if (argc > 1) {
        auto len = std::strlen(argv[1]);
        if (len >= 4 && argv[1][len-1] == 'c' && argv[1][len-2] == 'n' && argv[1][len-3] == '.') {
            read_file(argv[1]);
            save_all_lines();

        } else {
            std::fprintf(stderr, "ncc: " BOLD_RED "error" NORMAL ": unknown file format. Only files with extension 'nc' are supported\n");
            return EXIT_FAILURE;
        }
    } else {
        std::fprintf(stderr, "usage: ncc FILE\n");
        return EXIT_FAILURE;
    }

}

我已经将这个 c++ 程序编译成 webassembly。我想在浏览器文本区域中键入一个字符串,该字符串将作为参数发送到主函数。

我已将字符串转换为 blob(),然后将该 blob 对象转换为文件,但我应该如何在 webassembly 函数中发送文件。

#EXAMPLE IMPLEMENTATION
            var contents = `
                func main(){
                    print("hello");
                }
            `;
            var blob = new Blob([contents], { type: "text/plain" });
            var file = new File([blob], "test.nc", { type: "text/plain" });
    
            var data = new Uint8Array(file);
    
            Module._main(2, data);

标签: javascriptc++webassemblyemscripten

解决方案


如果您使用的是 Emscripten,则需要使用JS 端的方法将File对象“挂载”到模拟文件系统中。FS.mount

例如,假设默认MEMFS文件系统仿真类型(所有内容都在内存中),示例如下所示:

FS.mount(MEMFS, { files: [file /* this is your File object */] }, '/');

然后,您可以在 C++ 端以相应的文件名访问此文件,例如在您的情况下/test.nc

查看链接的文档以获取更多详细信息。


推荐阅读