在浏览器中使用 C++ DLL

Using C++ DLLs in a browser

提问人:towi_parallelism 提问时间:8/26/2015 最后编辑:towi_parallelism 更新时间:8/26/2015 访问量:2323

问:

我们有一个由一个巨大的C++项目生成的.DLL库。我们想在网络上公开它。

第一次尝试是使用 Emscripten。但我想根据这个答案,并不是每个库都可以与 JavaScript 链接。

我们想要的是一个客户端应用程序。原因是安全性和性能。该应用程序具有高度的交互性,因此几乎不可能以客户端-服务器方式实现。安全原因是,作为交互的一部分,用户可以访问底层硬件资源,因此将其托管在服务器上是有风险的。

有什么办法可以做到这一点吗?我只想知道是否有其他选项可用,或者是否有使用 Emscripten 的解决方案可用。

P.S:我们有C++库的源代码,但代码本身使用了许多其他库。

c++ dll web-applications 客户端 emscripten

评论

0赞 Rudolfs Bundulis 8/26/2015
通过网络公开的意思并不完全理解 - 仅仅能够在托管 dll 的同一台机器上的浏览器中运行它,或者有一个仍会连接到某个服务器的客户端 html 接口?
0赞 towi_parallelism 8/26/2015
@RudolfsBundulis,我们的偏好是能够在托管 dll 的同一台计算机上的浏览器中运行它。正如我所说,由于该库提供低级硬件访问,因此我们不希望在远程计算机上运行它
1赞 Rudolfs Bundulis 8/26/2015
好吧,这是有道理的。好吧,无论如何,另一种选择是您可以使用 node.js - node.js 绑定到C++非常容易,因此,如果您将自己暴露在node.js中,然后运行一个瘦节点服务器,该服务器将连接到您需要通过 Web 套接字或 ajax 请求集成的其他应用程序,我认为您可以实现所需的。
1赞 Rudolfs Bundulis 8/26/2015
不确定 Emscripten,因为它涉及生成 JavaScript,而 node.js 只是提供了一种将调用绑定到C++的方法。我会尝试发布一个包含更多细节的完整答案,但我认为这可能是您需要的(或者如果我没有正确的一些细节,也许不是)。
1赞 Rudolfs Bundulis 8/26/2015
当然,可能有更好的方法:) 我只是提供了这个,因为我也在使用这个组合在html前端向javascript公开DLL的功能,到目前为止,它运行良好。

答:

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。