2015-08-26 9 views
1

У нас есть библиотека .DLL, созданная из огромного проекта на C++. Мы хотели бы разоблачить его через Интернет.Использование C++ DLL в браузере

Первой попыткой было использовать Emscripten. Но я полагаю, что на основе This Answer не каждая библиотека может быть связана с JavaScript.

Что мы хотим иметь, это приложение на стороне клиента. Причина - безопасность и производительность. Приложение очень интерактивно, что делает его практически невозможным для реализации на клиентском сервере. Причина безопасности заключается в том, что в рамках взаимодействия пользователи могут получить доступ к основным аппаратным ресурсам, поэтому размещение на сервере рискованно.

Есть ли способ сделать это возможным? Я просто хочу знать, доступны ли другие варианты или доступно ли решение с использованием Emscripten.

P.S: У нас есть исходный код для нашей библиотеки C++, но сам код использует многие другие библиотеки.

+0

Не совсем понятно, что вы подразумеваете под воздействием через Интернет - просто возможность запускать его в браузере на том же компьютере, на котором размещена dll, или иметь клиентский html-интерфейс, который все равно будет подключаться к некоторому серверу? –

+0

@ RudolfsBundulis, мы предпочитаем иметь возможность запускать его в браузере на том же компьютере, на котором размещена dll. Как я уже сказал, поскольку библиотека обеспечивает низкоуровневый доступ к аппаратным средствам, мы предпочитаем не запускать ее на удаленном компьютере –

+0

, а затем почему браузер вместо обычного приложения с графическим интерфейсом, который загружает DLL? Любая конкретная причина? –

ответ

2

Одним из возможных подходов было бы вывести API из вашей DLL в Node.js через C++ bindings. Рассмотрим следующий пример из документации:

#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' 

Так как вам нужно связаться с каким-либо другим приложением на основе веб-то ваш node.js код, скорее всего, привязка к порту на той же машине, и обрабатывать запросы ajax или вызовы веб-сокетов из приложения, с которым вы интегрируетесь, а затем пересылать то, что необходимо для функций, открытых в DLL.

+0

Спасибо, но это переписывание библиотеки! Как я могу связать его с существующей библиотекой? –

+0

Ну, нет необходимости переписывать что-либо, вам просто нужно добавить клей-код, который предоставляет API - вам не нужно ничего менять в существующем коде. Но это может быть аспект, который я не понял, - поэтому вы хотите использовать существующие двоичные файлы и не компилировать что-нибудь? –

+0

Хорошо, я понял. Возможно, это можно будет изменить, просто добавив код клея. Идеальным было избегать компиляции, но это также должно работать. –