У меня есть приложение, которое использует DLL для расширения функциональности (модулей). Я хотел бы вставить некоторые конкретные функции из другой программы (которая является сервером).Запуск main() .exe в качестве части .dll
Другая программа имеет относительно простой n-main.cpp
#include <n.h>
int main(int argc, char * argv[])
{
// creates a listen server and blocks the main thread
// until it receives SIGKILL/SIGTERM or a custom HTTP header to stop
n::start(argc,argv);
}
Так что я сделал это:
#include <modulespecs.h>
#include <mymodule.h> // only some general specs
#include <n.h> // copied from n-main.cpp, no errors
// The main program calls this function to attach the module
void onModuleAttached(){
// create some fake arguments
int argc = 2;
char * argv[] = {"n.exe","someconfig.js"};
// and act as if
n::start(argc,argv);
}
Это отлично работает до сих пор, сервер создается, ждет входящих соединений, и отвечает на запросы должным образом.
Единственная проблема заключается в том, что при загрузке модуля сервер блокирует основное приложение, поэтому основное приложение не продолжает работать, поскольку оно ожидает, что сервер в моем модуле сначала завершит работу (чего не произойдет). И даже если это так, у сервера есть логика, чтобы полностью закрыть основное приложение, когда оно умирает.
Что я пробовал:
#include <thread>
void create_server(){
int argc = 2;
char * argv[] = {"n.exe","someconfig.js"};
// and act as if
n::start(argc,argv);
}
void onModuleAttached(){
// crashes
std::thread test(create_server);
// creates the server, then exits immediately
std::thread (create_server).join();
// same as join()
std::thread (create_server).detach();
}
Есть ли конкретный способ достижения этой цели?
Это уже происходит. За исключением 'StartServer()' и 'StopServer()' вызывается для каждого модуля (включая мой), и на самом деле они называются 'onModuleAttached()' и 'onModuleDetached()'. Попытка этого подхода с помощью 'std :: thread', объявленного вне функций, приводит к выходу основного приложения. К сожалению. –
Я попытался обобщить вопрос, чтобы соблюдать правила. Ваш ответ был правильным в данной ситуации, мне все равно пришлось изменить свой подход. Спасибо. –