在浏览器中使用c++ dll

Using C++ DLLs in a browser

本文关键字:c++ dll 浏览器      更新时间:2023-10-16

我们有一个从一个巨大的c++项目生成的。dll库。我们希望在网络上公开它。

第一次尝试使用Emscripten。但我猜基于这个答案,不是每个库都可以与JavaScript链接。

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

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

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

一种可能的方法是通过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)

基本上在init函数中,你可以将所有的入口函数暴露给你的DLL,它可以进一步返回基本类型,如字符串、数字等,甚至是包装的c++对象(然而到目前为止,我一直坚持使用基本类型来逃避修改现有的代码,只要你坚持基本类型,你只需要将c++类型翻译成v8)。因此,这段c++代码将允许在javascript中执行以下操作:

var object = require('./build/Release/addon');
console.log(addon.hello()); // 'world'

由于您需要与其他基于web的应用程序通信,那么您的node.js代码很可能绑定到同一台机器上的端口,并处理来自您正在集成的应用程序的ajax请求或web套接字调用,然后将所需的内容转发给从DLL暴露的函数