Re: Взаимодействие с LUA из внешнего ПО.
admin, я просто так и не понял как цеплять сюда файлы.
Сюда никак. Я просто переложу в "специальное место" и поправлю ссылку.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
QUIK -> DDE → Lua: учебники, общие вопросы → Взаимодействие с LUA из внешнего ПО.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
admin, я просто так и не понял как цеплять сюда файлы.
Сюда никак. Я просто переложу в "специальное место" и поправлю ссылку.
admin, Вы совершенно правы. Из первоначальной идеи просто подключиться к машине Клуа и вызывать функции Клуа ничего не получится. Об этом говорит даже КуПайл структура Луа-программы - Инит - Майн - это отнюдь не Луа-структура. Я наивно полагал, что функционал Клуа прикомпилированы к qlua.dll как Луа-функции.
А вот Ваша мысль вроде проходит - получить дескриптор потока, и в нем запускать извне др. программы. Тогда Клуа-функционал дествительно виден. Насколько это стабильно - не знаю.
Но винегрет технологий для взаимодействия с Квик оч. напрягает.
ЗЫ Тут открылась еще интересная вещь. Скрипт необязательно читать из файла. Можно и из стандартного потока ввода- вывода. В том числе, разумеется, уже скомпилированные. Диск и интерпретатор напрягать совершенно не обязательно.
admin, Вы совершенно правы. Из первоначальной идеи просто подключиться к машине Клуа и вызывать функции Клуа ничего не получится. Об этом говорит даже КуПайл структура Луа-программы - Инит - Майн - это отнюдь не Луа-структура. Я наивно полагал, что функционал Клуа прикомпилированы к qlua.dll как Луа-функции.
А вот Ваша мысль вроде проходит - получить дескриптор потока, и в нем запускать извне др. программы. Тогда Клуа-функционал дествительно виден. Насколько это стабильно - не знаю.
Но винегрет технологий для взаимодействия с Квик оч. напрягает.
ЗЫ Тут открылась еще интересная вещь. Скрипт необязательно читать из файла. Можно и из стандартного потока ввода- вывода. В том числе, разумеется, уже скомпилированные. Диск и интерпретатор напрягать совершенно не обязательно.
Извините, но это выглядит как котлеты вперемешку с мухами.
1.Давайте говорить правильно: нет такого языка qlua. Есть библиотека qlua.dll и в него вшит стандартный lua версии 5.1 И что в вашем понимании Луа-стркутура программы?
2. читайте книги по межпроцессному взаимодействию.
3. Интерпретатор "напрягается" в любом случае - при загрузке кода из файла (плейн-текст) или stdin происходит компиляция в байт код а затем выполнение.
Этот язык назвается Клуа, т.к. на Луа он просто не тянет.
Хорошо бы вы еще аргументировали это, интересно что на ваш взгляд есть в Lua, чего вы не наблюдаете в QUIK при использовании этого языка?
Если честно, то я все же так и не пойму какую схему вы хотите реализовать. Вот бы вы написали чуть подробнее. Не технические детали, как вы их себе представляете, а в общих словах: запускается такое-то приложение, далее происходит то-то и то-то, ну и т.д.
Тогда может участники смогли бы вам подсказать подходящее решение.
swerg,
Выдержка из мануала АРКА -"Интерпретатор языка Lua (QLua) – это библиотека......."
А что я хочу получить на выходе, вроде уже все написано. Вызов функций Клуа из внешней программы.
В Луа это без проблем. В Клуа это без танцев с бубном невозможно.
Выдержка из мануала АРКА -"Интерпретатор языка Lua "
Дальше можете не думать - это действительно интерпретатор языка Lua. qlua это название модуля.
Вызвать код вы и сейчас можете, просто надо помнить что внешней программой тут является quik.
Если вместо quik взять, например WoW, ты Вы хотите сделать следующее: а давайте я в скрипте Lua где-нибудь напишу свою функцию, а потом как-нибудь ее дерну из своей программы на C# и всех победю.
Чтобы было проще понять о чем вы - накидал стандартный простейший примерчик использования Lua, приведенный здесь: [url]http://www.lua.org/pil/24.1.html[/url]
Только в свойствах проекта указал линковку не с lua5.1.dll (т.е. подключил не lua5.1.lib), а подключил выложенный вами файл qlua.lib.
[url=http://files.mail.ru/9E6AA944A9734BE49B029C3D785562CF]архив с проектом и собранным exe[/url]
Пример я даже немного упростил, вбив непосредственно в него исполняемый текст на Lua:
#include <stdio.h>
#include <string.h>
#include "lua.hpp"
const char* LUA_SCRIPT = "print ('5*5=' .. tostring(5*5))";
int main (void) {
int error;
lua_State *L = lua_open(); /* opens Lua */
luaL_openlibs(L);
error = luaL_loadbuffer(L, LUA_SCRIPT, strlen(LUA_SCRIPT), "line")
|| lua_pcall(L, 0, 0, 0);
if (error) {
fprintf(stderr, "%s", lua_tostring(L, -1));
lua_pop(L, 1); /* pop error message from the stack */
}
lua_close(L);
return 0;
}
Рядом со скомпилированным exe нужно положить qlua.dll из квика.
Запускаем - получаем вывод в консоль:
5*5=25
т.е. выполняется наш скрипт на Lua. Заметьте, при этом используется именно и исключительно qlua.dll.
Если в свойствах проекта для линковки вместо qlua.lib указать lua5.1.lib и просто перекомпилировать тот же исходный кол - тогда для запуска программа будет требовать уже lua5.1.dll вместо qlua.dll, но также успешно выполнять тот же самый скрипт на Lua.
К чему я это все: на основании вышенаписанного хотелось бы понять что вы подразумевали под фразой:
Вызов функций Клуа из внешней программы.
В Луа это без проблем. В Клуа это без танцев с бубном невозможно.
И вот под этой:
то, что в Луа делается без вопросов в Клуа невозможно.
Не ради спора, поверьте. Я просто хочу вас понять.
Как видим - вызов внешних функций происходит без проблем, без вопросов и без танцев с бубнами как с использованием Lua, так и с использованием qlua.
Вы об этом говорили? или я вас не понял, и вы говорили о чем-то другом?
swerg, Вы просто запустили Луа, а не Клуа. Поэтому все получилось. У вас сейчас работает Луа-машина, а не Клуа машина. Клуа машина работает в потоке Квик.
Чтобы убедиться, запустите Квик и вызовите из внешней программы через Клуа любую функцию Клуа, IsConnected() (так кажется она пишется) например. Собственно, для этого весь сыр-бор и с файлом qlua.lib задуман. Клуа-машина наружу не работает.
Я это все уже прошел, полагая, что функционал Луа дополнен функциями мануала Квик. Это, к сожалению. не так.
Ну да, потому что в qlua.dll после вызова lua_open() и загрузки стандартных библиотек через вызов luaL_openlibs(L) происходит регистрация "IsConnected" и прочих поддерживаемых функций.
Но это ж стандартно так устроено подключение Lua, в любой программе. Как иначе-то можно сделать?
swerg, иначе можно было сделать прикомпилировав библиотеки Клуа к qlua.dll или дать нам эти библиотеки из Квик. Правда тогда и Луа не нужна.
зы Откройте, кстати, info.exe в dumpbin. Много интересного увидите.
swerg, иначе можно было сделать прикомпилировав библиотеки Клуа к qlua.dll или дать нам эти библиотеки из Квик. Правда тогда и Луа не нужна.
"Дать нам" - в каком смысле? сделать доступными из скриптов LUA экспортированные из библиотек функции? или дать некую библиотеку dll, которую можно было бы подключить к своему приложению и таким образом управлять QUIK? ну так такая библиотека же уже есть, trans2quik.dll называется. Но с такими библиотеками никак не вяжутся ваши слова "прикомпилировав библиотеки Клуа к qlua.dll".
Никак не могу вас понять.
Меня что удивляет: почему вы сами не желаете расписать подробнее ваше видение, чтобы не приходилось переспрашивать/уточнять?
mbul, Можно я все-таки буду называть это уе... Т.е. это не Луа, а нечто Луа-образное.
Луа - по определению, язык включений (см мануал [url=http://www.lua.ru/doc/6.html]Несмотря на то, что язык Lua был has разработан в качестве языка-расширения, для включения в программы-хозяева , написанные на C, он также зачастую используется как автономный язык[/url]). Клуа - чисто автономный. Использование синтаксиса Луа язык не определяет.
Синтаксис у С++ и С# или VB и VB.NET тоже, по большому счету, одинаковы.
Можете называть как угодно, это просто обозначает Ваш уровень квалификации и понимания вопроса Если честно, то я не знаю как должен называться язык, который получается из исходников Lua вкомпилированных в проект.
Ну а если не отвлекаться на название, то вашу задачу разумными средствами не решить. И связано это не с конкретной реализацией Lua, а с самой постановкой задачи.
swerg, ну все уже расписано в самом начале темы. Читайте собщения мои и admin.
mbul, вы меня задолбали моей квалификацией. Если по делу вам сказать нечего - не пишите в тему, плиз. А еще лучше удалите свои сообщения как флуд.
Вам уже несколько раз ответили - сделать то что Вы хотите очень сложно. Причем сложно не потому что это QUIK и недоделанное уе... "клуа", а просто потому что сложно. И еще будет работать медленно и ненадежно.
Дополнительно выяснилось следующее.
Луа (не Клуа), в отличии от Win-приложений, не умеет работать с Export-функциями (__declspec( dllexport ) declarator) exe-файлов. Только DLL. ЕХЕ-файлов она (Луа) просто, как таковых, не видит.
Я позже постараюсь накидать примерчик, проверить. Почему-то думаю, что вы ошибаетесь или как-то не совсем правильно ставите эксперимент, хотя, конечно, могут быть нюансы.
Вот только беда в том, что даже если это заработает - это не поможет вам сделать желаемое: exe в этом случае по сути будет все равно dll-кой внутри процесса квика, только название файла другое, а так - по суи та же dll. Т.е. запустив этот exe самостоятельно вы вовсе не окажетесь "внутри QUIK", ведь под запущенный exe Windows создаст (обязательно создаст, поверьте!) отдельный никак не связанный с квиком процесс.
Я правильно понимаю, что приложение, которое вы хотите запустить, есть у вас в виде исходного кода?
Если это так - чем вас не устраивает вариант просто буквально этот же текст перекомпилировать в виде dll, загрузить как доп. модуль Lua и радоваться?
admin, я хотел к экзэшнику Луа прицепить как к ДЛЛ - не получилось.
Сейчас ДЛЛ пишу, но новая проблема. В ДЛЛ не хочет открываться консоль (из экспорт-функции, естественно) - AllocConsole(). Уже при компиляции ошибки. В ЕХЕ все тоже самое работает без проблем. Хочется пообщаться с машинкой в диалоге.
Процесс создаст внутри Квик машины. Я хочу с нее дескриптор получить, и в него уже пихать свои функции.
На всяк случай. исходник [url=http://files.mail.ru/A347F8994FB24E4680E85578A0CA5F21]открытие консоли ЕХЕ[/url]. Может слегка не работать, т.к. последний вариант я сильно сломал, и бросил за ненадобностью.
Зачем же вы все так сложно делаете-то?
Нужен интверактив - возьмите любой гвотоый изуальный интерфейс, [url=https://quik2dde.ru/viewtopic.php?id=26]например VCLua[/url], или любой другой. И пользуйтесь им! что-то просто записать - лог-файл, евго сегда можно смотреть.
Зачем же вы все так сложно делаете-то?
Да вроде нет ничего проще консольных приложений. А с библиотеками, с ними еще разбираться надо.... целый процесс. Это на потом, если понадобится.
Да уже сделал. Луа из скрипта вызывает консоль. Дальше этого пока не пошел.
Есть парочка идей простых по организации межпроцессного взаимодействия. Писал скрипт lua, использующий сокеты (библиотека ZeroMQ). Но, к сожалению, не работает в многопоточном режиме из коллбэков.
Второй вариант - разделяемая память на Qt. Но не могу собрать обвязку на Qt. Пробовал кто-нибудь собиравть Qt bindings для lua?
Edited: скомпилировал qt bindings. Буду пробовать делать с использованием shared memory
ubase, удалось ли Вам продвинуться в передаче данных из QLua в свою программу и если да, то как?
Чтобы отправить ответ, вы должны войти или зарегистрироваться
QUIK -> DDE → Lua: учебники, общие вопросы → Взаимодействие с LUA из внешнего ПО.
Форум работает на PunBB, при поддержке Informer Technologies, Inc