根据我的尝试,您似乎无法捕获 pexe 写入标准输出的内容 - 它只是进入浏览器的标准输出(我花了几个小时才意识到它确实去了某个地方 - 我跟着一个糟糕的教程让我相信 pexes 标准输出将被发布到 javascript 端,并且想知道为什么它“什么也没做”)。
我目前也在将我的东西移植到 .pexe,结果证明这很简单,但这与我编写程序的方式有关:
我编写我的 (C++) 程序,以便所有代码部分仅从 std::istream 对象读取输入,并将其输出写入某些 std::ostream 对象。然后我只需将std::cin 和std::cout 传递给顶层调用,就可以在shell 中交互地使用程序。但是我可以轻松地换掉顶级调用以使用std::ifstream 和std::ofstream 来使用程序进行批处理(没有来自cat 的管道并重定向到文件,这在某些情况下可能会很麻烦) .
由于我是这样编写程序的,所以我可以像这样实现消息处理程序
class foo : public pp::Instance {
... ctor, dtor,...
virtual void HandleMessage(const pp::Var& msg) override {
std::stringstream i, o;
i << msg.AsString();
toplevelCall(i,o);
PostMessage(o.str());
}
};
所以我从浏览器获取的数据被放入一个字符串流中,其余代码可以用于输入。它得到另一个字符串流,其余代码可以将其输出写入其中。然后我只是将该输出发送回浏览器。 (缺点是您必须等待程序完成才能看到结果 - 您可以从 ostream 派生一个类并让
在 html/js 方面,您可以拥有一个 textarea 和一个 pre(我喜欢称之为 stdin 和 stdout ;-))和一个将 textarea 的内容发布到 pexe 的按钮 -并有一个事件处理程序,可以像这样将 pexe 中的消息写入pre
<embed id='pnacl' type='application/x-pnacl' src='manifest.nmf' width='0' height='0'/>
<textarea id="stdin">Type your input here...</textarea>
<pre id='stdout' width='80' height='25'></pre>
<script>
var pnacl = document.getElementById('pnacl');
var stdout = document.getElementById('stdout');
var stdin = document.getElementById('stdin');
pnacl.addEventListener('message', function(ev){stdout.textContent += ev.data;});
</script>
<button onclick="pnacl.postMessage(stdin.value);">Submit</button>
恭喜!您的程序现在在浏览器中运行!
我还没有完成移植我的编译器,但似乎这甚至适用于使用 flex 和 bison 的东西(您只需将 FlexLexer.h 复制到 pnacl sdk 的包含目录并忽略有关“注册”存储位置说明符:-)