26

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

Столкнулся с проблемой работы библиотеки под разными ОС. Под XP 32-битной и под 64-битной не работает одна и та же dllка, если только ее не перекомпилировать под каждую версию ОС. Причем ваша скомпилированная библиотека из архива, работает и там и там. Наверняка надо что-то указать в VS, только вот что и где? Буду очень признателен за подсказку.

27

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

boris,

я думаю, что у вас разные студии установлены, разные версии. Угадал?

В общем дело не в разрядности ОС, а в том, с какой run-time библиотекой С++ собирается проект. Настраивается это в свойствах проекта:

https://quik2dde.ru/static-img/cpp_lua-2-03.png

Как видно, есть 4 варианта:

  • Multi-threaded - релизная версия run-time библиотеки полностью "вшиваются" в итоговый exe или dll файл

  • Multi-threaded Debug - отладочная версия run-time библиотеки полностью "вшиваются" в итоговый exe или dll файл

  • Multi-threaded DLL - используется релизная версия run-time в виде внешней dll-ки

  • Multi-threaded Debug DLL - используется отладочная версия run-time в виде внешней dll-ки

Отладочные варианты выбираем для конфигурации проекта Debug, релизные - для варианта Release.
В случае выбора первого или второго варианта размер итогового exe или dll файла будет несколько больше, зато будет достаточно копировать его один на любую другую машиму и он будет работать, т.к. все есть в нем внутри.
В случае выбора третьего или четвертого варианта размер итогового exe или dll файла будет меньше, но вместе с ним надо будет не забывать устанавливать соотв. run-time. Делается это либо копированием нужных DLL из Visual Studio, либо устновкой соотв. пакета, в зависимости от версии студии, можно скачать с сайта Microsoft (вероятно видели у себя в установленных программах такую штуку, с названием что-то вроде "Visual C Run-time Library 2008" - это вот оно, ставится с какой-либо программой, которая так собрана).

Просто на той машине, на которой производится сборка, нужные run-time библиотеки DLL всегда уже есть, т.к. они устанавливаются вместе со студией. Но на другой машине, где этой версии студии нет и нет установленного сотв. run-time просто так не заработает.

Таким образом: хотим распространять много собственных библиотеки экономить место/трафик - собираем с DLL-runtime, но не забываем пользователю подсказывать где его скачать или прикладываем нужные dll-файлы (называются они что-то вроде msvcrt10.dll и т.п.)

Хотим без проблем копировать сделанные нами dll-ки на любой комп - собираем с вшитым run-time, т.е. выбираем первый или второй пункт.

Есть еще нюанс взаимодействия нескольких собственных DLL и менеджера памяти, но пока явно не актуально, поэтому зря забивать голову ерундой не буду )

Я здесь для примеров всегда собираю DLL-ки со вшитым run-time'ом, поэтому и нет проблем с запуском на любом компьютере.

28

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

Спасибо, это помогло.

29

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

Запускаю в Quik

error loading module 'luacdll' from file 'C:/Users/das/Desktop/роботы qpile/роботы c++/simple-lua-c-dll/bin/luacdll.dll':
    Не найден указанный модуль.

Запускаю в SciTE

>lua -e "io.stdout:setvbuf 'no'" "Dll.lua" 
6696
12.152
19.8
>Exit code: 0

Почему Quik не может запустить эту dll

30

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

Слишком мало данных, чтобы что-то сказать.
Попробуйте положить dll в каталог с QUIK и просто написать в Lua-скрипте
require("luacdll")

Кстати, вызывает удивление наклон слэшей в приведенном вами тексте ошибки. Точно в эту сторону? а в скрипте как написано?

31

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

точно так же и в скрипте, причем dll видит если в другую сторону слеш то не видит.
Установил QUIK другого брокера все заработало. Скорее всего не заработало потому что запускал скрипт не введя пароля в QUIK

32

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

Подскажите пожалуйста, я указываю в проекте подключаемые библиотеки Windows, например

#include <Windows.h>
#include <process.h>
#include <mmsystem.h>
#include <Winuser.h>

Обращение к ним будет только на этапе сборки моей dll, чтобы вытянуть из них нужные для сборки функции, или они остаются ссылками внутри моей dll? Это насчет быстродействия.

33

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

Для полной картины не хватает примера как, наоборот, из dll вызвать функцию LUA.
Есть такой торговый привод QScalp. В нём весь скрипт на lua состоит практически из одной строчки:
require("luacdll")

Это всё. И привод с помощью этой условной библиотеки делает всю работу - принимает котировки и параметры инструментов, отправляет в quik заявки и получает результат сделок и всего прочего. Вот и интересно как. Думаю в dll где-то запускается какой-нибудь Pipe или TCP сервер, который принимает команды от привода и отправляет их с помощью qlua в quik. Как ? Такого примера как раз и не хватает.

34

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

Есть ещё такая проблема.
Quik на другом компьютере никак не хотел запускать lua-скрипт и подключать библиотеку. Ругался на "error loading module Не найден указанный модуль". Компиляция с необходимыми опциями Runtime Library, которые были указаны выше, проблему не решало. В ходе исследования выяснил, что квику не хватает файла lua5.1.dll. В корне квика этот файл у меня лежал размером 32Кб. Скачал из интернета первый попавшийся lua5.1.dll размером 164Кб. Подложил его в папку квика, с заменой старого, и всё заработало.
Почему так ? Т.е. включение в проект файла contrib\lua5.1.lib недостаточно ?

35

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

GREEN_X5 пишет:

Обращение к ним будет только на этапе сборки моей dll, чтобы вытянуть из них нужные для сборки функции, или они остаются ссылками внутри моей dll? Это насчет быстродействия.

Друзья! Не там вы на быстродействие смотрите )

На этапе сборки (линковки) произойдет "настройка" вызова функций из WinAPI (которые в все находятся той куче dll, который лежат в каталоге с Windows), в момент старта все нужные dll замаппируются на адресное пространство вашего процесса - и будет работать как надо, т.е. быстро.
Это всё стандартный механизм работы Windows, но это не важно, не забивайте голову лишним )

36

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

reg05 пишет:

Для полной картины не хватает примера как, наоборот, из dll вызвать функцию LUA.

Непременно будет.

reg05 пишет:

Думаю в dll где-то запускается какой-нибудь Pipe или TCP сервер, который принимает команды от привода и отправляет их с помощью qlua в quik. Как ? Такого примера как раз и не хватает.

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

reg05 пишет:

Т.е. включение в проект файла contrib\lua5.1.lib недостаточно ?

Разумеется, потому что lua5.1.lib - это "библиотека ссылок", т.е. она просто позволяет собрать проект, при этом все вызовы функций Lua перенаправляет в lua5.1.dll. Поэтому lua5.1.dll безусловно необходимая для работы библиотека.

Правильную lua5.1.dll предлагается взять в этой теме:
http://quik2dde.ru/viewtopic.php?id=47

37 (2015-01-26 21:52:02 отредактировано swerg)

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

sam063rus,

вы конечно же правы. Можно собрать  и с полностью статической линковкой потрохов Lua.
Но если мы говорим про библиотеки, которые будем применять в QUIK, то настоятельно рекомендую использовать или линковку с QLua.dll в своих проектах, или использовать прокси Lua5.1.dll
Чтобы не было проблем при многопоточном доступе к хранилищу Lua-переменных.

38

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

swerg пишет:

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

Так я и не спрашиваю про IPC, а спрашиваю про примеры о вызове qlua функций из dll.

В принципе, из разных кусков в интернете кое что накопал и вызывать lua функции научился. Но пока всё равно в голове каша. Какой-то стек, какие-то -1 +1 в стеке, lua_pop, lua_call и т.д. и т.п. Хотелось бы где-то получить чёткое представление на подобие того, как описана тема подключения dll в данном топике.
Единственную строчку require в lua скрипте тоже сделал. Дополнительный lua скрипт подгружаю в dll с помощью функции luaL_loadstring. Скрипт хранится в файле ресурсов.

39

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

Подскажите пожалуйста, загрузил  ваш пример, написал скрипт подключающий эту библиотеку, при попытке запуска скрипта из QUIK получаю ошибку:

error loading module 'luacdll' from file 'C:\work\lua_scripts\luacdll.dll':
    C:\work\lua_scripts\luacdll.dll:1: '=' expected near 'ђ'

с чем это может быть связано?

Использую QUIK-Junior, когда выполнял те же манипуляции ранее всё работало без проблем.

40

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

xpoftik,
у вас какая-то ошибка в LUA скрипте, а не в dll
Например, вы сохранили его не в той кодировке.

41

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

Да, подобную проблему обнаружил на каком то форуме, пробовал сохранить скрипт как в ANSI, так и в UTF-8:

Скрипт сохранен в UTF-8:

Syntax error while compiling C:\Program Files\QUIK-Junior\lua1.lua: C:\Program Files\QUIK-Junior\lua1.lua:1: unexpected symbol near 'п'

Скрипт сохранен в ANSI:

error loading module 'luacdll' from file 'C:\Program Files\QUIK-Junior\luacdll.dll':
    C:\Program Files\QUIK-Junior\luacdll.dll:1: '=' expected near 'ђ'

Текст скрипта:

local lcPath;
lcPath = getScriptPath();

message(lcPath);

package.path = package.path .. ";" .. getScriptPath() .. "\\?.dll";
package.cpath = package.cpath .. ";" .. getScriptPath() .. "\\?.dll";

require("luacdll");

42

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

swerg пишет:

xpoftik,
у вас какая-то ошибка в LUA скрипте, а не в dll
Например, вы сохранили его не в той кодировке.

Вы были правы, очевидно какая то ошибка в скрипте была... только не могу понять какая именно, как можно было в 3х строчках заблудиться.
Сделал в лоб, установил QScalp, там то коннектор к lua гарантированно работает, подменил AgentName в коннекторе своей библиотекой, всё заработало.

43 (2015-03-10 14:31:10 отредактировано swerg)

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

ok, тогда далее не про то.
И речь не " в трёх строчках", еще раз: речь в каком формате у вас сохранён файл lua-скрипта! Ну сохраните вы его аккуратно через Save As а вашем редакторе или не используйте эти дурацкие через-чур умные редакторы текста.


[+]Spoiler

Вы с нуля проект делали или взяли исходники с этого сайта, включая файл проекта?

Посмотрите еще что у вас в свойствах проекта Confuguration Properties->General->CharacterSet
Должно быть Use Multi-Byte Character Set, а не Unicode Character Set.

44

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

swerg пишет:

Вы с нуля проект делали или взяли исходники с этого сайта, включая файл проекта?

Посмотрите еще что у вас в свойствах проекта Confuguration Properties->General->CharacterSet
Должно быть Use Multi-Byte Character Set, а не Unicode Character Set.

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

PS: Учту этот факт в дальнейшем.

45

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

swerg пишет:

ok, тогда далее не про то.
И речь не " в трёх строчках", еще раз: речь в каком формате у вас сохранён файл lua-скрипта! Ну сохраните вы его аккуратно через Save As а вашем редакторе или не используйте эти дурацкие через-чур умные редакторы текста.

Да, всё верно сохранил через стандартный Notepad в ANSI кодировке, заработал и мой скрипт тоже. До этого делал тоже самое в Notepad++.

Большое спасибо за быструю помощь!

PS: На самом деле впервые в жизни получил адекватный ответ и помощь на русскоязычном форуме!

46

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

Я уже видел на этом форуме ровно такую же жалобу на Notepad++: не пересохраняет в ANSI даже при явном указании кодировки. Косяк какой-то в нём чудится мне.

47 (2016-09-29 11:26:53 отредактировано sam063rus)

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

-

48

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

sam063rus, уже сделал, но спасибо.

49

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

sam063rus, изначальный вариант с добавлением пути к имеющимся (ранее настроенным) видится более правильным, однако.
Или речь лишь про то, чтобы попробовать "не в этом ли дело"?

50

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

Могли бы вы привести пример функции, принимающей в качестве аргумента строку и возвращающую эту строку?