1

Тема: Можно ли вывести в консоль из C++ библиотеки?

Подскажите пожалуйста, а из скрипта Lua в итоге можно вызывать С или С++ код в dll ?
Я попробовал в тестовой функции вызвать просто вывод на консоль:

//=== Реализация функций, вызываемых из LUA ====================================================================//

static int forLua_TestFunc(lua_State* L) 
{
    printf("Hello, World!");
    std::cout<< "Hello, World!"<<std::endl;

    lua_pushstring(L, "Привет из C/C++");
    return(1);
}

Функция сама вызывается, но код С/С++ - не выполняется.

2

Re: Можно ли вывести в консоль из C++ библиотеки?

Serg_ пишет:

Функция сама вызывается, но код С/С++ - не выполняется.

Что значит "код С/С++ - не выполняется"?

Если вы в Lua-скрипте напишете

message(lua_dll_x64_name.TestFunc())

то у вас отобразится в QUIK окно с сообщением "Привет из C/C++", так?
Значит код С/С++ выполняется, значение из функции, расположенной в dll, в Lua передается.

Но консоли-то у вас нет в случае dll-библиотеки, она просто не создана, вот вы и не видите как и что в нее выводится.

Удобнее вместо консоли будет писать в файл из С++ кода (этакий лог).

Еще удобно использовать функцию OutputDebugString (это WinAPI функция)
Каким инструментом просматривать результат её работы написано в этой теме [url]https://quik2dde.ru/viewtopic.php?id=108[/url] (там про применение в Lua-скриптах, но суть от этого не меняется, представление как работать с результатами этой функции та тема даёт).

3 (2022-09-21 17:27:37 отредактировано Serg_)

Re: Можно ли вывести в консоль из C++ библиотеки?

А действительно работает да, Спасибо!

Получается, можно сделать такую простую вещь: просто из Lua передавать данные в dll, а в dll уже подключить к примеру boost asio и просто передавать эти данные на какой нибудь локальный порт, а в самом приложении уже подключить сервер boost asio и принимать эти данные ? Чтобы не мучатся с Luasocket и тому подобному.

4 (2022-09-21 17:40:41 отредактировано swerg)

Re: Можно ли вывести в консоль из C++ библиотеки?

Внутри C++ кода никто и ни в чем вас не ограничивает smile
Не забывайте только про потенциально возможный вызов функций вашей библиотеки из разных потоков, если в C++ коде будут какие-то глобальные переменные / хранилища. Например, если будете вызывать функции вашей библиотеки из call-back'ов и main() - то как раз возникнет одновременный вызов из разных потоков.

5 (2022-09-21 18:20:22 отредактировано Serg_)

Re: Можно ли вывести в консоль из C++ библиотеки?

swerg пишет:

Внутри C++ кода никто и ни в чем вас не ограничивает smile
Не забывайте только про потенциально возможный вызов функций вашей библиотеки из разных потоков, если в C++ коде будут какие-то глобальные переменные / хранилища. Например, если будете вызывать функции вашей библиотеки из call-back'ов и main() - то как раз возникнет одновременный вызов из разных потоков.

Не совсем понял эту мысль.

Если не сложно, можете объяснить на таком просто примере: предположим я использую блокирующие сокеты на пуле потоков.
Предположим из Lua я передал данные и они пришли в dll, я их записываю в очередь std::deque, сам std::deque под мьютексом, если какой то поток из пула потоков свободен я вызываю функцию send().
Какая тут может быть потенциальная проблема ?

6 (2022-09-21 21:21:26 отредактировано swerg)

Re: Можно ли вывести в консоль из C++ библиотеки?

Serg_,
вы описали в довольно общих словах, а потому давать какой-то точный однозначный ответ мне бы не хотелось. Впрочем, вникать в детали вашей задумки и подробно расспрашивать - наверное тоже.

Рекомендация простая: обращения к объектам, к которым может быть одновременный доступ из нескольких потоков, надо защищать объектами синхронизации.

Как минимум в вашем описании это объект  std::deque, но про него вы и так уже пишете.

7

Re: Можно ли вывести в консоль из C++ библиотеки?

swerg пишет:

Serg_,
вы описали в довольно общих словах, а потому давать какой-то точный однозначный ответ мне бы не хотелось. Впрочем, вникать в детали вашей задумки и подробно расспрашивать - наверное тоже.

Рекомендация простая: обращения к объектам, к которым может быть одновременный доступ из нескольких потоков, надо защищать объектами синхронизации.

Как минимум в вашем описании это объект  std::deque, но про него вы и так уже пишете.

Я просто не пойму - это рекомендация, как то связано со спецификой Lua или Вы даете рекомендацию по программированию С++ ? smile

8 (2022-09-21 22:17:06 отредактировано swerg)

Re: Можно ли вывести в консоль из C++ библиотеки?

Serg_ пишет:

Я просто не пойму - это рекомендация, как то связано со спецификой Lua или

Рекомендация связана с напоминанием о том, что в рамках Lua-Quik функции в такой dll могут вызываться из разных потоков одновременно. Что надо сразу учитывать при ее проектировании.
и это есть специфика ее применения именно в рамках Lua-Quik.

Если же эту dll вы будете применять в рамках другого какого-то интерпретатора Lua (не в рамках QUIK), то вероятнее всего никакой многопоточности там не будет.

9

Re: Можно ли вывести в консоль из C++ библиотеки?

Понял, спасибо!

10

Re: Можно ли вывести в консоль из C++ библиотеки?

Serg_, я ведь правильно понимаю (по другим темам), что вам удалось отобразить консоль из dll?
Поделитесь кодом, необходимым для этого.

11

Re: Можно ли вывести в консоль из C++ библиотеки?

Вот так:

#include <Windows.h>


    //----------------------------------------------
    AllocConsole();
    freopen("CONOUT$", "w", stdout);
    //----------------------------------------------

    std::cout << "CHECK" << std::endl;