提问人:towi_parallelism 提问时间:8/26/2015 最后编辑:towi_parallelism 更新时间:8/26/2015 访问量:2323
在浏览器中使用 C++ DLL
Using C++ DLLs in a browser
问:
我们有一个由一个巨大的C++项目生成的.DLL库。我们想在网络上公开它。
第一次尝试是使用 Emscripten。但我想根据这个答案,并不是每个库都可以与 JavaScript 链接。
我们想要的是一个客户端应用程序。原因是安全性和性能。该应用程序具有高度的交互性,因此几乎不可能以客户端-服务器方式实现。安全原因是,作为交互的一部分,用户可以访问底层硬件资源,因此将其托管在服务器上是有风险的。
有什么办法可以做到这一点吗?我只想知道是否有其他选项可用,或者是否有使用 Emscripten 的解决方案可用。
P.S:我们有C++库的源代码,但代码本身使用了许多其他库。
答:
3赞
Rudolfs Bundulis
8/26/2015
#1
一种可能的方法是通过C++绑定将 DLL 中的 API 公开给 Node.js。请考虑文档中的以下示例:
#include <node.h>
using namespace v8;
void Method(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate);
args.GetReturnValue().Set(String::NewFromUtf8(isolate, "world"));
}
void init(Handle<Object> exports) {
NODE_SET_METHOD(exports, "hello", Method);
}
NODE_MODULE(addon, init)
基本上,在函数中,您可以向DLL公开所有入口函数,这些函数可以进一步返回原始类型,如字符串,数字等,甚至包装C++对象(但是到目前为止,我一直坚持使用基元以避免修改现有代码,只要您坚持使用原始类型,您只需要将C++类型转换为v8)。所以这个C++代码将允许从javascript执行以下操作:init
var object = require('./build/Release/addon');
console.log(addon.hello()); // 'world'
由于您需要与其他基于 Web 的应用程序进行通信,因此您的node.js代码很可能会绑定到同一台计算机上的端口,并处理来自您正在集成的应用程序的 ajax 请求或 Web 套接字调用,然后将所需的内容转发到从 DLL 公开的函数。
评论
0赞
towi_parallelism
8/26/2015
谢谢,但这是重写库!如何将其链接到现有库?
0赞
Rudolfs Bundulis
8/26/2015
好吧,没有必要重写任何东西,你只需要添加公开 API 的胶水代码 - 你不需要更改现有代码中的任何内容。但这可能是我不明白的一个方面 - 所以你想使用现有的二进制文件并避免编译任何东西?
0赞
towi_parallelism
8/26/2015
好了,现在我明白了。也许可以更改它只是为了添加胶水代码。理想的情况是避免编译,但这也应该有效。
0赞
Rudolfs Bundulis
8/26/2015
好吧,我知道如果有一种技术可以只接受您拥有的二进制文件,那将是一个完美的解决方案,但是我不知道任何这样的事情:) 但是,如果没有更好的(我并不是说没有),一些胶水代码并不是可能发生的最糟糕的事情。
2赞
Rudolfs Bundulis
8/26/2015
是的,这是另一种方法,然后您不必重新编译原始 DLL。
上一个:Qooxdoo 客户端保护机制
评论