26

Re: Взаимодействие с LUA из внешнего ПО.

ubase пишет:

admin, я просто так и не понял как цеплять сюда файлы. smile

Сюда никак. Я просто переложу в "специальное место" и поправлю ссылку.

27 (2013-02-15 00:44:58 отредактировано ubase)

Re: Взаимодействие с LUA из внешнего ПО.

admin, Вы совершенно правы. Из первоначальной идеи просто подключиться к машине Клуа и вызывать функции Клуа ничего не получится. Об этом говорит даже КуПайл структура Луа-программы - Инит - Майн - это отнюдь не Луа-структура. Я наивно полагал, что функционал Клуа прикомпилированы к qlua.dll как Луа-функции. smile
А вот Ваша мысль вроде проходит - получить дескриптор потока, и в нем запускать извне др. программы. Тогда Клуа-функционал дествительно виден. Насколько это стабильно - не знаю.
Но винегрет технологий для взаимодействия с Квик оч. напрягает.
ЗЫ Тут открылась еще интересная вещь. Скрипт необязательно читать из файла. Можно и из стандартного потока ввода- вывода. В том числе, разумеется, уже скомпилированные. Диск и интерпретатор напрягать совершенно не обязательно.

28

Re: Взаимодействие с LUA из внешнего ПО.

ubase пишет:

admin, Вы совершенно правы. Из первоначальной идеи просто подключиться к машине Клуа и вызывать функции Клуа ничего не получится. Об этом говорит даже КуПайл структура Луа-программы - Инит - Майн - это отнюдь не Луа-структура. Я наивно полагал, что функционал Клуа прикомпилированы к qlua.dll как Луа-функции. smile
А вот Ваша мысль вроде проходит - получить дескриптор потока, и в нем запускать извне др. программы. Тогда Клуа-функционал дествительно виден. Насколько это стабильно - не знаю.
Но винегрет технологий для взаимодействия с Квик оч. напрягает.
ЗЫ Тут открылась еще интересная вещь. Скрипт необязательно читать из файла. Можно и из стандартного потока ввода- вывода. В том числе, разумеется, уже скомпилированные. Диск и интерпретатор напрягать совершенно не обязательно.

Извините, но это выглядит как котлеты вперемешку с мухами.
1.Давайте говорить правильно: нет такого языка qlua. Есть библиотека qlua.dll и в него вшит стандартный lua версии 5.1 И что в вашем понимании Луа-стркутура программы?
2. читайте книги по межпроцессному взаимодействию.
3. Интерпретатор "напрягается" в любом случае - при загрузке кода из файла (плейн-текст) или stdin происходит компиляция в байт код а затем выполнение.

29

Re: Взаимодействие с LUA из внешнего ПО.

ubase пишет:

Этот язык назвается Клуа, т.к. на Луа он просто не тянет.

Хорошо бы вы еще аргументировали это, интересно что на ваш взгляд есть в Lua, чего вы не наблюдаете в QUIK при использовании этого языка?

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

30 (2013-02-15 10:19:21 отредактировано ubase)

Re: Взаимодействие с LUA из внешнего ПО.

swerg,
Выдержка из мануала АРКА -"Интерпретатор языка Lua (QLua) – это библиотека......."
А что я хочу получить на выходе, вроде уже все написано. Вызов функций Клуа из внешней программы.
В Луа это без проблем. В Клуа это без танцев с бубном невозможно.

31

Re: Взаимодействие с LUA из внешнего ПО.

ubase пишет:

Выдержка из мануала АРКА -"Интерпретатор языка Lua "

Дальше можете не думать - это действительно интерпретатор языка Lua. qlua это название модуля.
Вызвать код вы и сейчас можете, просто надо помнить что внешней программой тут является quik.
Если вместо quik взять, например WoW, ты Вы хотите сделать следующее: а давайте я в скрипте Lua где-нибудь напишу свою функцию, а потом как-нибудь ее дерну из своей программы на C# и всех победю.

32 (2013-02-15 12:31:36 отредактировано swerg)

Re: Взаимодействие с LUA из внешнего ПО.

Чтобы было проще понять о чем вы - накидал стандартный простейший примерчик использования Lua, приведенный здесь: http://www.lua.org/pil/24.1.html
Только в свойствах проекта указал линковку не с lua5.1.dll (т.е. подключил не lua5.1.lib), а подключил выложенный вами файл qlua.lib.

архив с проектом и собранным exe

Пример я даже немного упростил, вбив непосредственно в  него исполняемый текст на 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.
Вы об этом говорили? или я вас не понял, и вы говорили о чем-то другом?

33 (2013-02-15 13:41:15 отредактировано ubase)

Re: Взаимодействие с LUA из внешнего ПО.

swerg, Вы просто запустили Луа, а не Клуа. Поэтому все получилось. У вас сейчас работает Луа-машина, а не Клуа машина. Клуа машина работает в потоке Квик.
Чтобы убедиться, запустите Квик и вызовите из внешней программы через Клуа любую функцию Клуа, IsConnected() (так кажется она пишется) например. Собственно, для этого весь сыр-бор и с файлом qlua.lib задуман. Клуа-машина наружу не работает.
Я это все уже прошел, полагая, что функционал Луа дополнен функциями мануала Квик. Это, к сожалению. не так.

34

Re: Взаимодействие с LUA из внешнего ПО.

Ну да, потому что в qlua.dll после вызова lua_open() и загрузки стандартных библиотек через вызов luaL_openlibs(L) происходит регистрация "IsConnected" и прочих поддерживаемых функций.

Но это ж стандартно так устроено подключение Lua, в любой программе. Как иначе-то можно сделать?

35 (2013-02-15 13:52:21 отредактировано ubase)

Re: Взаимодействие с LUA из внешнего ПО.

swerg, иначе можно было сделать прикомпилировав библиотеки Клуа к qlua.dll или дать нам эти библиотеки из Квик. Правда тогда и Луа не нужна. smile
зы Откройте, кстати, info.exe в dumpbin. Много интересного увидите.

36 (2013-02-15 13:55:54 отредактировано swerg)

Re: Взаимодействие с LUA из внешнего ПО.

ubase пишет:

swerg, иначе можно было сделать прикомпилировав библиотеки Клуа к qlua.dll или дать нам эти библиотеки из Квик. Правда тогда и Луа не нужна.

"Дать нам" - в каком смысле? сделать доступными из скриптов LUA экспортированные из библиотек функции? или дать некую библиотеку dll, которую можно было бы подключить к своему приложению и таким образом управлять QUIK? ну так такая библиотека же уже есть, trans2quik.dll называется. Но с такими библиотеками никак не вяжутся ваши слова "прикомпилировав библиотеки Клуа к qlua.dll".
Никак не могу вас понять.

Меня что удивляет: почему вы сами не желаете расписать подробнее ваше видение, чтобы не приходилось переспрашивать/уточнять?

37

Re: Взаимодействие с LUA из внешнего ПО.

ubase пишет:

mbul, Можно я все-таки буду называть это уе...  Т.е. это не Луа, а нечто Луа-образное.
Луа - по определению, язык включений (см мануал Несмотря на то, что язык Lua был has разработан в качестве языка-расширения, для включения в программы-хозяева , написанные на C, он также зачастую используется как автономный язык). Клуа - чисто автономный. Использование синтаксиса Луа язык не определяет.
Синтаксис у С++ и С# или VB и VB.NET тоже, по большому счету, одинаковы.

Можете называть как угодно, это просто обозначает Ваш уровень квалификации и понимания вопроса smile Если честно, то я не знаю как должен называться язык, который получается из исходников Lua вкомпилированных в проект.
Ну а если не отвлекаться на название, то вашу задачу разумными средствами не решить. И связано это не с конкретной реализацией Lua, а с самой постановкой задачи.

38 (2013-02-15 20:01:44 отредактировано ubase)

Re: Взаимодействие с LUA из внешнего ПО.

swerg, ну все уже расписано в самом начале темы. Читайте собщения мои и admin.

39

Re: Взаимодействие с LUA из внешнего ПО.

ubase пишет:

mbul, вы меня задолбали моей квалификацией. Если по делу вам сказать нечего - не пишите в тему, плиз. А еще лучше удалите свои сообщения как флуд.

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

40 (2013-02-15 21:21:57 отредактировано ubase)

Re: Взаимодействие с LUA из внешнего ПО.

Дополнительно выяснилось следующее.
Луа (не Клуа), в отличии от Win-приложений, не умеет работать с Export-функциями (__declspec( dllexport ) declarator) exe-файлов. Только DLL. ЕХЕ-файлов она (Луа) просто, как таковых, не видит.

41

Re: Взаимодействие с LUA из внешнего ПО.

Я позже постараюсь накидать примерчик, проверить. Почему-то думаю, что вы ошибаетесь или как-то не совсем правильно ставите эксперимент, хотя, конечно, могут быть нюансы.

Вот только беда в том, что даже если это заработает - это не поможет вам сделать желаемое: exe в этом случае по сути будет все равно dll-кой внутри процесса квика, только название файла другое, а так - по суи та же dll. Т.е. запустив этот exe самостоятельно вы вовсе не окажетесь "внутри QUIK", ведь под запущенный exe Windows создаст (обязательно создаст, поверьте!) отдельный никак не связанный с квиком процесс.

Я правильно понимаю, что приложение, которое вы хотите запустить, есть у вас в виде исходного кода?
Если это так - чем вас не устраивает вариант просто буквально этот же текст перекомпилировать в виде dll, загрузить как доп. модуль Lua и радоваться?

42 (2013-02-16 00:20:23 отредактировано ubase)

Re: Взаимодействие с LUA из внешнего ПО.

admin, я хотел к экзэшнику Луа прицепить как к ДЛЛ - не получилось.
Сейчас ДЛЛ пишу, но новая проблема. В ДЛЛ не хочет открываться консоль (из экспорт-функции, естественно) -  AllocConsole(). Уже при компиляции ошибки. В ЕХЕ все тоже самое работает без проблем. Хочется пообщаться с машинкой в диалоге. smile
Процесс создаст внутри Квик машины. Я хочу с нее дескриптор получить, и в него уже пихать свои функции.
На всяк случай. исходник открытие консоли ЕХЕ. Может слегка не работать, т.к. последний вариант я сильно сломал, и бросил за ненадобностью. smile

43

Re: Взаимодействие с LUA из внешнего ПО.

Зачем же вы все так сложно делаете-то? smile

Нужен интверактив - возьмите любой гвотоый изуальный интерфейс, например VCLua, или любой другой. И пользуйтесь им! что-то просто записать - лог-файл, евго сегда можно смотреть.

44

Re: Взаимодействие с LUA из внешнего ПО.

admin пишет:

Зачем же вы все так сложно делаете-то? smile

Да вроде нет ничего проще консольных приложений.  А с библиотеками, с ними еще разбираться надо.... целый процесс. smile Это на потом, если понадобится.
Да уже сделал. Луа из скрипта вызывает консоль. Дальше этого пока не пошел.

45 (2013-04-04 22:06:43 отредактировано mikhailkis)

Re: Взаимодействие с LUA из внешнего ПО.

Есть парочка идей простых по организации межпроцессного взаимодействия. Писал скрипт lua, использующий сокеты (библиотека ZeroMQ). Но, к сожалению, не работает в многопоточном режиме из коллбэков.
Второй вариант - разделяемая память на Qt. Но не могу собрать обвязку на Qt. Пробовал кто-нибудь собиравть Qt bindings для lua?
Edited: скомпилировал qt bindings. Буду пробовать делать с использованием shared memory

46

Re: Взаимодействие с LUA из внешнего ПО.

ubase, удалось ли Вам продвинуться в передаче данных из QLua в свою программу и если да, то как?