76 (2022-09-20 09:11:34 отредактировано swerg)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Serg_,
покажите код функции luaopen_lua_dll_x64_name()

PS
Я вот главного никак не пойму.
В первом посте выложен готовый проект. Полностью готовый к сборке. Рабочий.
Ну вот скажите, какой смысл "с нуля" всё проделывать?
Взять готовый, переименовать всё под себя - и радоваться содержательному труду, а не вот этим всем бесполезным граблям.  roll

PPS
И еще. Наиболее актуальный код - на github, ссылка в первом сообщении.
В сообщениях на форуме может быть "разное", в том числе неактуальное и ошибочное.

77 (2022-09-20 13:46:16 отредактировано Serg_)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

swerg пишет:

Serg_,
покажите код функции luaopen_lua_dll_x64_name()

PS
Я вот главного никак не пойму.
В первом посте выложен готовый проект. Полностью готовый к сборке. Рабочий.
Ну вот скажите, какой смысл "с нуля" всё проделывать?
Взять готовый, переименовать всё под себя - и радоваться содержательному труду, а не вот этим всем бесполезным граблям.  roll

PPS
И еще. Наиболее актуальный код - на github, ссылка в первом сообщении.
В сообщениях на форуме может быть "разное", в том числе неактуальное и ошибочное.

В самом первом сообщении - в самом проекте отсутcвует файл самого проекта .sln.

Сам исходный пример "zip-архив" из первого сообщения не работает и выдает ошибку в Quik`е.

Если уж говорить откровенно, то не один проект на Github`е по итогу не работает.
Вомзожно это все работает на Вашей системе, но у других нет.


PS: Вот пришла мысль, а не легче ли это будет сделать через Luasocket и просто поднять простенький сервер у себе в приложении и таким образом гонять данные, чем гемороится вот таким вот образом.

78

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Serg_ пишет:

В самом первом сообщении - в самом проекте отсутcвует файл самого проекта .sln.

Да, это так.
Сделано умышленно, т.к. при открытии файла проекта .vcxproj автоматически создается .sln. При этом в .sln никаких настроек полезных не содержится, так что не видится смысла таскать его для демопримера.

Serg_ пишет:

Если уж говорить откровенно, то не один проект на Github`е по итогу не работает.
Возможно это все работает на Вашей системе, но у других нет.

У вас есть уникальная возможность добавить требуемое для сборки на вашей системе и помочь таким образом данному проекту. Git-репозиторий открыт.
Все было сделано еще в VS2010 / VS2015. Считаем, что с upgrade под новые версии студий разработчик справится самостоятельно, ибо это элементарная задача, в отличии от сбора всех тех сведений, которые требуются для того, чтобы приведенный пример вообще заставить с нуля работать.
Впрочем, уверен, каждый может самостоятельно с нуля всё сделать, не используя приведенные примеры.

Serg_ пишет:

PS: Вот пришла мысль, а не легче ли это будет сделать через Luasocket и просто поднять простенький сервер у себе в приложении и таким образом гонять данные, чем гемороится вот таким вот образом.

Ваша жизнь, ваш выбор wink
Начать предлагаю с того, чтобы добиться работоспособности Luasocket, для начала собрав его smile

79 (2022-09-20 14:14:55 отредактировано swerg)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Serg_ пишет:

Сам исходный пример "zip-архив" из первого сообщения не работает и выдает ошибку в Quik`е.

Просьба привести ошибку.
И обязательно уточнить версию терминала QUIK и версию интерпретатора Lua, выбираемого для запуска скрипта.

Примеры были сделаны когда-то давно, под терминал QUIK тех времен. Считаем это просто за базу для старта, т.к. материал этот в кучку "с нуля" осознать требует времени. Имея базу "как это вообще все выглядит", расширяться уже намного проще. Верно?

Будет здорово, если вы обновите в репозитории все что требуется для сборки в более новых версиях.
Как минимум дописать что требуется дополнить для сборки в более новых версиях студии (апгрейдить проект прямо в репозитории - нехорошо, ибо даунгрейдить VS не умеет).

80

Re: Создание собственной DLL на C++ для LUA (в QUIK)

swerg пишет:

Просьба привести ошибку.
И обязательно уточнить версию терминала QUIK и версию интерпретатора Lua, выбираемого для запуска скрипта.

Вот такая ошибка:

C:\QUIK_x64_KA\luacdll.dll

Quik 8.7.13

81 (2022-09-20 16:28:53 отредактировано swerg)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Serg_ пишет:

Quik 8.7.13

Скачал, посмотрел что там в архиве в первом сообщении.
В самом деле, архив уже очень устаревший. Там еще вариант кода и собранного бинарника для Lua 5.1.
А [url=https://quik2dde.ru/viewtopic.php?id=320]в терминале начиная с 8.5 есть только Lua 5.3[/url].

Так что ориентироваться надо на версию из GitHub.

(Архив в первом сообщении когда-нибудь обновлю.)

82

Re: Создание собственной DLL на C++ для LUA (в QUIK)

swerg пишет:

Serg_,
покажите код функции luaopen_lua_dll_x64_name()


//=== Необходимые для Lua константы ============================================================================//
#define LUA_LIB
#define LUA_BUILD_AS_DLL


//=== Заголовочные файлы LUA ===================================================================================//
extern "C" 
{
#include "C:\\Users\\source\\repos\\Quil_Lua_connector\\Lua_staticlib_files_x64\\lauxlib.h"
#include "C:\\Users\\source\\repos\\Quil_Lua_connector\\Lua_staticlib_files_x64\\lua.h"
}

#pragma comment(lib, "C:\\Users\\source\\repos\\Quil_Lua_connector\\Lua_staticlib_files_x64\\lua53.lib")

//=== Заголовочные файлы LUA ===================================================================================//




//=== Реализация функций, вызываемых из LUA ====================================================================//
static int forLua_TestFunc(lua_State* L) {
    lua_pushstring(L, "Привет из C/C++");
    return(1);
}


//=== Регистрация реализованных в dll функций, чтобы они стали "видимы" для Lua ================================//
static struct luaL_Reg ls_lib[] = {
    {"TestFunc", forLua_TestFunc},
    {NULL, NULL}
};

//=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================//
extern "C" LUALIB_API int luaopen_lua_dll_x64_name(lua_State * L) {
    lua_newtable(L);
    luaL_setfuncs(L, ls_lib, 0);
    lua_pushvalue(L, -1);
    lua_setglobal(L, "lua_dll_x64_name");
    return 0;
}

Но quik при запуске cледующего скрипта:

lua_dll_x64_name = require("lua_dll_x64_name")
message(lua_dll_x64_name.TestFunc())

выдает ошибку:

 attempt to index a boolean value (global 'lua_dll_x64_name')

Может быть Вы могли бы подсказать, ну что не так в этом коде ?

83 (2022-09-20 17:05:27 отредактировано swerg)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Serg_ пишет:

Может быть Вы могли бы подсказать, ну что не так в этом коде ?

Хорошо, но вы ведь уже заглянули на GitHub? или во второе сообщение этой темы?
Там ведь другой код инициализации, правда?

Исправьте:

extern "C" LUALIB_API int luaopen_lua_dll_x64_name(lua_State * L) {
    luaL_newlib(L, ls_lib);
    return 1;
}

84 (2022-09-20 17:07:21 отредактировано swerg)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

На самом деле я думаю, что приведенный вами Си-код тоже заработает.
Только тогда надо Lua-код поправить на такой вариант:

require("lua_dll_x64_name")
message(lua_dll_x64_name.TestFunc())

Но все же лучше поправить Си-код как я написал выше.

85 (2022-09-20 17:19:20 отредактировано swerg)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

А что касается вообще всей этой "магии" - то надо просто почитать про Си API для Lua.
Квик тут ни при чем совершенно. Информации в сети много, как официальной документации, так и разных вводных статей, в том числе на русском.
Там все вполне себе несложно, только немного разобраться с идеей стека. Скажу даже больше - все весьма просто.
Особенно я это понял, когда попробовал к PHP написать плагин на С++. Вот где капец и выверт мозга! Интерфейс Lua после этого просто  няшка.

86 (2022-09-20 19:49:15 отредактировано Serg_)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Спасибо!
Видимо заработало, только теперь Quik говорит, что сработал внутренний эксепшн и просто закрывается.
Не, все равно ошибка.
Судя по комментарием до меня, ни у кого так и не получилось запустить реально - по этим "инструкциям"

87

Re: Создание собственной DLL на C++ для LUA (в QUIK)

При запуске скрипта:

path = getScriptPath() .. "\\lua_dll_x64_name.dll"
package.loadlib(path, "luaopen_lua_dll_x64_name")()

function main()
   message(lua_dll_x64_name.TestFunc())
end

Все таже ошибка:

\Quil_Lua_connector\Lua_script.lua.txt:2: attempt to call a nil value

88

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Serg_ пишет:

Видимо заработало, только теперь Quik говорит, что сработал внутренний эксепшн и просто закрывается.
Не, все равно ошибка.

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

Serg_ пишет:

При запуске скрипта:

path = getScriptPath() .. "\\lua_dll_x64_name.dll"
package.loadlib(path, "luaopen_lua_dll_x64_name")()

Но это что-то уже совершенно другой, не похожий на предыдущий скрипт, приводимый вами.
Почему? предыдущий заработал?

Просьба завернуть полностью ваш имеющийся проект с исходниками в архив, выложить куда-нибудь (яндекс диск, например, или выслать на почту swerg@swerg.ru). Будет возможность предметно вам что-то подсказать.
Пока по тем обрывкам, которые вы приводите, совершено не понятно где затык.

89 (2022-09-20 22:02:04 отредактировано swerg)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Serg_ пишет:

package.loadlib(path, "luaopen_lua_dll_x64_name")()

Выделенные скобочки в конце этой строки - лишние. Убрать. (где вы взяли такой пример? откуда эти скобочки пустые?)
Фактически что здесь написано: "вызвать функцию package.loadlib() с двумя параметрами, после чего результат, который эта функция вернула - мы ожидаем, что это будет тип "функция" - эту функцию выполнить без аргументов".
Но package.loadlib(path, "luaopen_lua_dll_x64_name") ничего не возвращает (т.е. возвращает как бы nil), соответственно Lua вам и ругается на эту строку "попытка вызвать функцию на nil-значении".

Почитайте все же про сам язык Lua статьи. Синтаксически язык с виду вроде "очень знакомый", но все же он достаточно "своеабыкий", надо узнать про него. Там не все с виду будет интуитивно.

90 (2022-09-20 22:56:05 отредактировано Serg_)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

swerg пишет:
Serg_ пишет:
path = getScriptPath() .. "\\lua_dll_x64_name.dll"
package.loadlib(path, "luaopen_lua_dll_x64_name")()

Но это что-то уже совершенно другой, не похожий на предыдущий скрипт, приводимый вами.
Почему? предыдущий заработал?

Нет, я пробую два этих скрипта - просто уже потому что уже просто не знаю, что делать. Ну просто не хочет работать и все (((

Я заархивировал проект в winrar (пароль: 1): [url]https://drive.google.com/file/d/1RVBibzoN88ZIhU6D779o7mUoj6zoCIr7/view?usp=sharing[/url]

91 (2022-09-20 23:19:27 отредактировано swerg)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Serg_,
я открыл выложенный вами проект.

На форуме вы приводите один текст, одни названия функций - в вашем проекте все совершенно иначе называется.

Я пишу вам:

swerg пишет:

Исправьте:

extern "C" LUALIB_API int luaopen_lua_dll_x64_name(lua_State * L) {
    luaL_newlib(L, ls_lib);
    return 1;
}

Что видим в вашем проекте:

extern "C" LUALIB_API int luaopen_Quil_Lua_connector(lua_State * L)
{
    lua_setglobal(L, "Quil_Lua_connector");
    luaL_newlib(L, ls_lib);
    return 1;
}

Почему? зачем?

Тяжело же вот так вот "удаленно" общаться, когда производятся совершенно другие действия.

Хорошо, основная проблема.
Вы писали, что когда все же собралось - то при запуске скрипта с вызовом библиотеки QUIK падает с исключением.
Да, это основная проблема была в вашем проекте.
Вы взяли не знаю какие и откуда взятые библиотеки lua53.lib / lua54.lib. Собственно в них вся и проблема.
В ваших lib-файлах полностью вшит интерпретатор Lua, и, судя по всему, это какие-то бинарно не совместимые сборки с имеющимися в QUIK lua53.dll и lua54.dll. Но для корректной работы вашей библиотеки в составе QUIK вызовы функций Lua-API должны осуществляться из lua53.lib / lua54.lib. Только тогда ваша библиотека будет работать корректно в составе QUIK и, в особенности, в части многопоточности. А для этого надо изготовить такие lua53.lib / lua54.lib, которые были бы лишь обертками для вызова из lua53.dll и lua54.dll. Как это сделать - описано в интернете.

Я вас несколько раз просил: возьмите за основу выложенный проект. Там все это уже сделано, продумано, проверено, lib-файлы лежат какие надо, настроены варианты сборки
Release для Lua5.1 (уже неактуально, конечно)
Release53 для Lua5.3
Release54 для Lua5.4

Все уже настроено, в относительными путями и т.д.

Но вы пошли путём "с нуля". Оно в общем-то похвально, но одно мне досадно: раз уж вы самостоятельно выбради путь "пройти по всем граблям" - зачем вы ругаете инструкции? да еще подозреваете всех вокруг, что "ни у кого на самом деле не работает".
Некрасиво это.

Итого.

1. Исправьте тело функции luaopen_Quil_Lua_connector в вашем проекте на:

extern "C" LUALIB_API int luaopen_Quil_Lua_connector(lua_State * L) {
    luaL_newlib(L, ls_lib);
    return 1;
}

2. Сделайте самостоятельно lib-библиотеки на основании lua*.dll файлов, либо возьмите готовые lib-файлы с проекта на гитхабе из первого сообщения данной темы.

3. Исправьте тестовый Lua-скрипт на:

Quil_Lua_connector = require("Quil_Lua_connector")
message(Quil_Lua_connector.TestFunc())

4. Перекомпилируйте заново проект вашей библиотеки, подложите собранную dll в каталог с QUIK - и все заработает! wink
https://quik2dde.ru/static-img/18/privet-cpp.png

92

Re: Создание собственной DLL на C++ для LUA (в QUIK)

swerg пишет:

Хорошо, основная проблема.
Вы писали, что когда все же собралось - то при запуске скрипта с вызовом библиотеки QUIK падает с исключением.
Да, это основная проблема была в вашем проекте.
Вы взяли не знаю какие и откуда взятые библиотеки lua53.lib / lua54.lib. Собственно в них вся и проблема.
В ваших lib-файлах полностью вшит интерпретатор Lua, и, судя по всему, это какие-то бинарно не совместимые сборки с имеющимися в QUIK lua53.dll и lua54.dll. Но для корректной работы вашей библиотеки в составе QUIK вызовы функций Lua-API должны осуществляться из lua53.lib / lua54.lib. Только тогда ваша библиотека будет работать корректно в составе QUIK и, в особенности, в части многопоточности. А для этого надо изготовить такие lua53.lib / lua54.lib, которые были бы лишь обертками для вызова из lua53.dll и lua54.dll. Как это сделать - описано в интернете.

Странно, но я скачивал из с рекомендованного самим Lua сайта: [url]https://sourceforge.net/projects/luabinaries/files/5.3.5/Windows%20Libraries/Static/[/url]

93

Re: Создание собственной DLL на C++ для LUA (в QUIK)

zip-архив с примерами в первом посте обновил актуальной версией исходников и сборками.

94

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Serg_ пишет:

Странно, но я скачивал из с рекомендованного самим Lua сайта: [url]https://sourceforge.net/projects/luabinaries/files/5.3.5/Windows%20Libraries/Static/[/url]

Если бы вы все это запускали со взятым там же собранным интерпретатором Lua - то все работало бы замечательно.
Но запускается все это в рамках QUIK, "есть нюансы".

95

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Про lib-библиотеки вот здесь еще написано.
[url]https://quik2dde.ru/viewtopic.php?id=47[/url]

Сама по себе эта статья потеряла уже полностью актуальность, т.к. теперь  QUIK лежат честные lua53.dll / lua54.dll с полным run-time Lua.
Но что касается многопоточности и сторонних библиотек - то суть там объяснена.

96

Re: Создание собственной DLL на C++ для LUA (в QUIK)

swerg пишет:

Serg_,
4. Перекомпилируйте заново проект вашей библиотеки, подложите собранную dll в каталог с QUIK - и все заработает! wink
https://quik2dde.ru/static-img/18/privet-cpp.png

Это просто какой то из кругов Ада похоже.
Я взял Ваши .lib и .h файлы из проекта из папки contrib - перекомпилировал.

Исправил скрипт и код.

Все те же самые ошибки. Может быть я в аду просто, я не знаю, что происходит.

97

Re: Создание собственной DLL на C++ для LUA (в QUIK)

На скрипт:

Quil_Lua_connector = require("Quil_Lua_connector")
message(Quil_Lua_connector.TestFunc())

Ошибка:

Critical error ACCESS_VIOLATION in script C:\Users\Serg\source\repos\Quil_Lua_connector\Lua_script_1.lua.txt

98 (2022-09-20 23:57:02 отредактировано swerg)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Приведенную мною картинку с текстом я точно нарисовал не в фотошопе smile
Что-то вы все же не так делаете.
Думаю надо остыть, маленько успокоиться - и все получится. wink

Если хотите - напишите на swerg@swerg.ru
Могу удаленно подключиться к вашей машине и на месте уже найдем в чем беда.

99 (2022-09-21 00:30:04 отредактировано swerg)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Serg_,
я в самом деле взял ваш проект, сделал 4 указанные мною действия - и все запустилось.
Честно-честно.

Уточню: собирал только Release вариант. Debug не собирал.

100 (2022-09-21 00:40:10 отредактировано Serg_)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

А какая у Вас версия Quik ?
Я тоже собирал только release.