, определите все методы как свойства обработчика:
var Handler={};
Handler.application_run = function (name) {
console.log(name)
}
Теперь назовите его следующим образом:
var somefunc = "application_run";
Handler[somefunc]('jerry codes');
Выход: коды jerry
// Handler.js
module.exports={
// name_exported : internal_name
application_run = function (name) {
console.log(name)
}
}
Использовать метод, определенный в Handler.js
в different.js
:
// different.js
var methods = require('./Handler.js') // path to Handler.js
methods['application_run']('jerry codes')
Выход: коды jerry
Поскольку это DLL, проблема может заключаться в разных кучах, используемых для распределения и освобождения (попробуйте построить библиотеку статически и проверить, будет ли это работать).
Проблема в том, что DLL и шаблоны не согласны вместе очень хорошо. В общем, в зависимости от привязки среды выполнения MSVC это может быть проблемой, если память выделена в исполняемом файле и освобождена в DLL и наоборот (потому что у них могут быть разные кучи). И это может произойти с шаблонами очень легко, например: вы push_back () в вектор внутри removeWhiteSpaces () в DLL, поэтому векторная память выделяется внутри DLL. Затем вы используете выходной вектор в исполняемом файле, и как только он выходит из области видимости, он освобождается, но внутри исполняемого файла, чья куча ничего не знает о куче, из которой она была выделена. Bang, вы мертвы.
Это можно обойти, если и DLL, и исполняемый файл используют одну и ту же кучу. Чтобы обеспечить это, DLL и исполняемый файл должны использовать динамическую среду выполнения MSVC, поэтому убедитесь, что обе они связаны с динамической динамикой, а не статически. В частности, exe должен быть скомпилирован и связан с / MD [d] и библиотекой с / LD [d] или / MD [d], а также с / MT [d]. Обратите внимание, что впоследствии компьютеру, на котором будет запущено приложение, потребуется запустить исполняемую библиотеку MSVC (например, путем установки «Распространяемого на Visual C ++» для конкретной версии MSVC).
Вы могли бы получить эту работу даже с / MT, но это сложнее - вам нужно будет предоставить некоторый интерфейс, который позволит также освободить объекты, выделенные в DLL. Например, что-то вроде:
__declspec(dllexport) void deallocVector(std::vector<std::string> &x);
void deallocVector(std::vector<std::string> &x) {
std::vector<std::string> tmp;
v.swap(tmp);
}
(однако это не очень хорошо работает во всех случаях, так как это нужно вызывать явно, поэтому он не будет называться, например, в случае исключения - для правильного решения , вам нужно будет предоставить некоторый интерфейс из DLL, который будет охватывать вектор под капотом и позаботится о правильном RAII)
EDIT: окончательное решение было фактически состоять в том, чтобы все проектов (exe, dll и весь проект googleTest), встроенных в многопоточную Debug DLL (/ MDd) (по умолчанию проекты GoogleTest встроены в многопоточную отладку (/ MTd))
У меня была аналогичная проблема, и оказалось, что мой проект unittest был настроен на другую библиотеку времени исполнения кода, поэтому, установив ее так же, как проект DLL, тогда исключение кучи