根据我的尝试,您似乎无法捕获 pexe 写入标准输出的内容 - 它只是进入浏览器的标准输出(我花了几个小时才意识到它确实去了某个地方 - 我遵循了一个糟糕的教程这让我相信 pexes 标准输出将被发布到 javascript 端,并且想知道为什么它“什么也没做”)。
我目前也在将我的东西移植到 .pexe,结果证明这很简单,但这与我编写程序的方式有关:
我编写我的(C++)程序,以便所有代码部分仅从std::istream
对象读取输入并将其输出写入某个std::ostream
对象。然后我只需将std::cin
and传递std::cout
给顶层调用,就可以在 shell 中交互地使用程序。但是随后我可以轻松地换出顶级调用以使用 anstd::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 派生一个类并让 << 运算符直接发布到浏览器...... nacl 应该带有一个这样做的类- 我不知道它是否真的......)
在 html/js 方面,您可以拥有 atextarea
和 a pre
(我喜欢将其称为 stdin 和 stdout ;-) )和一个将 textarea 的内容发布到 pexe 的按钮 - 并有一个事件处理程序来写入来自的消息pre
像这样的 pexe
<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 的包含目录并忽略有关“注册”的警告存储位置说明符:-)