пример dll

Страницы: 1
RSS
пример dll
 
Господа, я с горем пополам выучил Луа. Но его возможностей мне уже не хватает, так как накапливаю большие объёмы данных и обрабатываю их. Теперь начал с горем пополам учить С++.
Не могу понять как написать простейший dll-файл под КВИК. Например, файл принимает данные текущей таблицы по инструменту SBER (колбек OnParam). Подскажите пожалуйста. Премного благодарен. Прошу простить за тупенькие вопросы.
 
Лучше всех отвечает на подобные вопросы Гугл
https://www.google.ru/search?q=простейшая+dll+lua&oq=простейшая+dll+lua&aqs=chrome..69i57j33.10061j0...
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
Let_it_go написал:
Не могу понять как написать простейший dll-файл под КВИК. Например, файл принимает данные текущей таблицы по инструменту SBER (колбек OnParam).
Вот вам простой пример QLua скрипта, который обрабатывает OnParam, и DLL с одной функцией, которая считает спред.

Файл myprog.lua:
Код
local mylib = require "mylib"

local fRun = true

function OnParam(class_code, sec_code)
    if class_code =="TQBR" and sec_code == "SBER" then
        local bid   = getParamEx(class_code, sec_code, "BID")
        local offer = getParamEx(class_code, sec_code, "OFFER")
        if bid.result == "1" and offer.result == "1" then
            message("mylib.spread = "..mylib.spread(tonumber(bid.param_value), tonumber(offer.param_value)))
        end
    end
end

function main()
    while fRun do
        sleep(1000)
    end
end

function OnStop(s)
    fRun = false
end
Файл mylib.c (или mylib.cpp), компилируется как код Си или Си++, без разницы:
Код
#include <windows.h>

#define LUA_LIB
#define LUA_BUILD_AS_DLL
#ifdef __cplusplus
extern "C" {
#endif
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#ifdef __cplusplus
}
#endif

static int spread(lua_State *L)
{
    double bid   = luaL_checknumber(L, 1);
    double offer = luaL_checknumber(L, 2);

    /* здесь наши вычисления */

    lua_pushnumber(L, offer-bid);
    return 1;
}

static const luaL_Reg mylib_funcs[] = {
    {"spread", spread},
    {NULL, NULL}
};

#ifdef __cplusplus
extern "C" 
#endif
LUALIB_API int luaopen_mylib(lua_State *L)
{
    luaL_register(L, "mylib", mylib_funcs);
    return 1;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {return TRUE;}
Далее, кладёте оба файла myprog.lua и mylib.dll в одну папку, и дальше как обычно открываете myprog.lua в Quik'е и запускаете.
 
Дошли руки разобраться в этом. Я попутно уже пару недель учу Си++ на уровне элементарных вещей.
При запуске кода программа спотыкается на этом месте:


словно бы у меня не подключены библиотеки.
Стандартная луа у меня установлена:
 
разобрался.
это берётся в файлах наподобие этого
https://www.lua.org/source/5.1/lua.h.html
 
Цитата
Let_it_go написал:
разобрался.
это берётся в файлах наподобие этого
https://www.lua.org/source/5.1/lua.h.html
Заголовочные файлы Lua-машины у Вас лежат в .../Lua/5.1/include.
 
Я качал эти файлы с сайта lua.org и кидал в папку где лежит моя программа для Си++.
CodeBlocks называется.

Судя по вашим словам их можно было не кидать в эту папку, а подключить как то иначе?
 
Да, с помощью указания соответствующей опции компилятору. Вижу у Вас MinGW, так что, полагаю, сборка производится с помощью gcc. Для gcc указать дополнительные директории для поиска заголовочных файлов можно с помощью опции -I
gcc ... -I "C:\Program Files (x86)\Lua\5.1\include" ...

Code::Blocks уже давно не пользовался, но наверняка там можно найти отвечающий за это пункт меню. Что-нибудь типа "Include Directories".
Забегая вперёд: дополнительные директории для поиска библиотечных файлов для линковки можно задать и линкеру (т.е. компоновщику).
 
Цитата
Let_it_go написал:
Я качал эти файлы с сайта lua.org и кидал в папку где лежит моя программа для Си++.
CodeBlocks называется.

Судя по вашим словам их можно было не кидать в эту папку, а подключить как то иначе?
Так у вас ничего не получится. У разных компиляторов различный формат библиотечных LIB файлов. Насколько я вижу вы поставили себе «Lua for Windows», которая собрана на MSVC и в комплекте у неё .lib файлы для MSVC. А в качестве среды вы установили себе CodeBlocks с MinGW и компилятором GCC, у которого свой формат LIB файлов с расширением .a. Вы не сможете откомпилировать и слинковать свой проект с такой связкой.

У вас три возможности по CodeBlocks:
• Либо настройте CodeBlocks на использование MSVC компилятора, приблизительно как это описано здесь:
 CodeBlocks_MSVC_setup.pdf
• Либо скачайте библиотеки Lua под MinGW отсюда:
 lua-5.1.5_Win32_dllw4_lib.zip (или отсюда lua-5.1.4-4-mingw32-dev.tar.xz)
 и дальше пытайтесь слинковаться с ними, если там версии совпадут или не будет ещё какой засады.
• Либо скачайте исходники Lua 5.1.5 и соберите из них свой проект и библиотеки под свою версию компилятора в CodeBlocks.

Но мой вам совет, не усложняйте себе жизнь, бросьте вы этот CodeBlocks, поставьте себе MSVC и работайте спокойно.
 
Цитата
Suntor написал:
Но мой вам совет, не усложняйте себе жизнь, бросьте вы этот CodeBlocks, поставьте себе MSVC и работайте спокойно.
1. у С++ - кодера не может быть спокойной жизни по определению.
2. чем больше разносторонней инфы, тем пушистей извилины.
3. на вантузе мир клином не сошелся, особенно в РФ.
ткчт всг, бро :)
 
Цитата
rinat написал:
1. у С++ - кодера не может быть спокойной жизни по определению.
Это да... поэтому в другой ветке писал, что начинать надо с чистого Си.
Цитата
rinat написал:
2. чем больше разносторонней инфы, тем пушистей извилины.
Но не для новичка... человек только осваивает язык, а щас зароется MinGW и прочую лабудень настраивать... он возненавидит этот Си/Си++ ещё даже не начав... оно надо?
Цитата
rinat написал:
3. на вантузе мир клином не сошелся, особенно в РФ.
Есть хорошее правило, пиши на родных для системы инструментах... человек будет под Quik писать DLL, зачем ему MinGW и GCC? не хочется ругаться, поэтому не буду, но вы поняли...
 
Цитата
Suntor написал:
Это да... поэтому в другой ветке писал, что начинать надо с чистого Си.
обучал недавно младшеклассника и оказалось, что таки нет - лучше начинать именно с С++:
1. простая схема ввода-вывода
2. строки искаропки
3. классы удобно от простого к нужному- далее java и ведроид.
4. обработка исключений аналогично классам - на пальцах и по полочкам

ключевое на старте - минимум букаф - максимум понимания, имо.
работает очень хорошо.

Цитата
Suntor написал:
щас зароется MinGW и прочую лабудень настраивать
да, но причина не в этом, а в непроектном подходе к решению задачи.

Цитата
Suntor написал:
человек будет под Quik писать DLL
возможно ему dll в таком виде и не нужно ... :)
кто сказал, что нужно всё тащить в луа-машину?
может брать данные, юзать их снаружи и выполнять как внешнюю транзакцию:
- модульная масштабируемая и кастомизирумая структура, ключевое слово - структура
- разделение на дата-екзекушн -более, чем логично
- исключение gui - как в принципе самой тормозной и ненадежной части
- перспектива на прямое/другое подключение результата усилий

в итоге: писать надо не под систему или КВИК, а ставить задачи и подбирать системным образом оптимальные  инструменты

Цитата
Suntor написал:
не хочется ругаться, поэтому не буду
и не нужно, тк по сути верно предложен неправильный принцип
1. полный нуб не должен сразу писать длл
2. двигаться надо от простого к сложному - как можно дольше и дальше ИЗБЕГАЯ ЛЮБЫХ IDE
3. g++ отлично подходит для начального использования в любой среде, даже на венде, но см п.2
4. ТС-у читать максимально простые книжки/учебники и потом Страуструпа, искать how to compile & build
суета - зло, имо :)
 
rinat
Цитата
возможно ему dll в таком виде и не нужно ... :)
кто сказал, что нужно всё тащить в луа-машину?
может брать данные, юзать их снаружи и выполнять как внешнюю транзакцию:
- модульная масштабируемая и кастомизирумая структура, ключевое слово - структура
- разделение на дата-екзекушн -более, чем логично
- исключение gui - как в принципе самой тормозной и ненадежной части
- перспектива на прямое/другое подключение результата усилий
уточните пожалуйста о чём речь.
Вы имеете в виду, что не покидая языка Луа, можно по особому написать код (на Луа), чтобы он был быстрым?
что значит "брать данные, юзать их снаружи и выполнять как внешнюю транзакцию "?
 
Цитата
Let_it_go написал:
не покидая языка Луа, можно по особому написать код (на Луа),
вполне странно такое слышать в теме "пример dll"
речь идет о том, что коль скоро решено использовать С/С++ в виде доп. длл, то мало логики это всё пытаться впихнуть в луа-машину.

и такой вопрос сразу провоцирует на ответ в неприятной форме: оставте тему языков и покидания чего-либо в сторонку и начните с начала ...
а именно, часто задачу участника фин. рынка можно разделить на подзадачи:
1. получение данных с контролем соединения
2. контроль целостности данных
3. буферизация данных для текущего анализа
4. сохранение данных в базу - варьируется по необходимости
5. анализ буфера нарастающим итогом и торговая логика
6. формирование торговых приказов
7. контроль за прохождением и исполнением заявок

для 1 Вы используете Луа
для 2-6  Вы можете делать используя любой язык программирования
для 7 доступны trans2quik

на скорость обработки данных влияет способ и структура их хранения, количество преобразований типов и логика парсинга
н-р: возможно быстрее будет посимвольный парсинг текстовых/числовых данных полученных из КВИК на рам-диске без преобразования таймштампа, а хранить в бинарной структуре для более неторопливого майнинга

если не готовы использовать trans2quik, то вполне нетрудно возвращать результат по 2-6 в луа-скрипт, либо использовать импорт транзакций через tri
 
Цитата
rinat написал:
обучал недавно младшеклассника и оказалось, что таки нет - лучше начинать именно с С++:
Это потому, что вы его учили языку программирования, а не самому программированию как таковому... А это суть две большие разницы. Использование высокоуровневых языков и их абстракций действительно сокращает код и ускоряет процесс написания программ, но к сожалению, за этими конструкциями «леса не видно»... Уж не вспомню сейчас название, но в одной из серьёзных западных компаний даже тест при приёме на работу был такой, человеку давали простые задачи, которые он успешно решал на том же Си++, а потом во второй части собеседования просили объяснить, что делают его программы на железном уровне. Как оказывается большинство вполне неплохих программистов неспособны объяснить и не понимают, во что превращаются их программы после компиляции.
Цитата
rinat написал:
возможно ему dll в таком виде и не нужно ... :)
Именно такая и нужна, собственно это и есть тема данной ветки.
Цитата
rinat написал:
в итоге: писать надо не под систему или КВИК, а ставить задачи и подбирать системным образом оптимальные  инструменты
Если вы не заметили, то находитесь на форуме Quik... ))) Да и предыдущие темы не читали скорее всего. Человеку эта DLL нужна чтобы вынести тяжёлые вычисления из его Lua скрипта. Вполне чёткая задача, ради которой он вообще начал это «обучение». И та задача, которую ему нужно сделать, требует минимум использования базовой математики из обычного Си, плюс добавить шаблон DLL к этому, который я кинул вначале. Никакие Си++, классы, исключения и т.п. ему не нужны... Это тоже самое, что человека пришедшего попросить молоток, чтобы забить гвоздь, послали в техникум учиться на 5 лет, со словами «сначала диплом принеси, а потом молоток получишь».
 
Цитата
Цитата
Suntor написал:
что делают его программы на железном уровне

обучал недавно младшеклассника
спор ради спора или реально не вдумались? :)

Цитата
Suntor написал:
Если вы не заметили, то находитесь на форуме Quik... )))
не вижу тут чего-то странного,
квик - грамотная поделка, дык почему бы не накинуть на вентилятор? :)

Цитата
Suntor написал:
предыдущие темы не читали скорее всего.
не читал, но и не говорю ничего слишком узкоспецифичного вроде

Цитата
Suntor написал:
эта DLL нужна чтобы вынести тяжёлые вычисления из его Lua скрипта.
именно. именно необходимость такого подхода и вызывает максимальные сомнения ... исходя из общего перечня задач типового участника
Цитата
Suntor написал:
человека пришедшего попросить молоток, чтобы забить гвоздь, послали в техникум учиться на 5 лет, со словами «сначала диплом принеси, а потом молоток получишь».
а вот это кстати только так и правильно ибо и молоток сломает и сам убьется :)

и...и это таки форум и никто тут команд не раздает, пусть слушает и что-то понимает или не понимает
результат мне не болит ... :)
 
Цитата
rinat написал:
Цитата
Цитата
Suntor   написал:
что делают его программы на железном уровне
обучал недавно младшеклассника
спор ради спора или реально не вдумались? :)
я тоже был когда-то младшеклассником... и помню чему меня учили... стек, куча, мантисса, сортировки, деревья, Дональд Кнут был настольной книгой, свою первую программу вообще в машинных кодах писал... видимо я совсем от жизни отстал, и современных школьников учат только делать cout <<... я это могу понять, но согласиться с этим, никак...
Цитата
rinat написал:
не читал, но и не говорю ничего слишком узкоспецифичного вроде
вы просто посылаете человека в увлекательное путешествие получать «больше разносторонней инфы»... и моё мнение, что это в данном случае просто усложнит человеку жизнь, и пойдя по этому пути он может в итоге не добраться до пункта назначения в приемлемые сроки
Цитата
rinat написал:
именно. именно необходимость такого подхода и вызывает максимальные сомнения ...
предложите свой... и можно будет сравнить, обсудить плюсы и минусы...
Цитата
rinat написал:
а вот это кстати только так и правильно ибо и молоток сломает и сам убьется :)
нет, я не согласен... вы когда в первый раз в руки молоток взяли у вас был к этому времени диплом?... )))
 
Цитата
Suntor написал:
младшеклассником... и помню чему меня учили... стек, куча, мантисса, сортировки, деревья
в третьем классе? в 9 лет? Вы -гений? :)

Цитата
Suntor написал:
и моё мнение, что это в данном случае просто усложнит человеку жизнь
как-то мне кажется, что финансовый рынок - это не то место, где надо искать легкой жизни, причем весь вопрос именно во времени - не суетиться и системно развиваться, понимая где находишься и куда идешь :)

Цитата
Suntor написал:
и можно будет сравнить, обсудить плюсы и минусы
выше  писал форумные лозунги с пунктами, реализация - дело интимное :)

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

Цитата
Suntor написал:
нет, я не согласен...
что ж, будьте несогласным. у нас свобода мнений :)
 
Цитата
rinat написал:
в третьем классе? в 9 лет? Вы -гений? :)
«в начальных, но точно не помню», «до 10 лет, не старше», «нет»
Цитата
rinat написал:
как-то мне кажется, что финансовый рынок - это не то место, где надо искать легкой жизни
это уже философия... а речь о приземлённой конкретной задаче
Цитата
rinat написал:
выше  писал форумные лозунги с пунктами, реализация - дело интимное :)
в том то и дело, что это лишь общие наставления были... вы конкретно объясните человеку, каким способом он должен решить свою задачу и сколько времени потребуется на это
Цитата
rinat написал:
дилетантизм и верхоглядство - бичь нашей современной реальности.
опять философия... то-бишь попытка уйти от ответа на прямой вопрос: Что первое было у вас в руках по жизни: молоток или диплом? )))

P.S. Предлагаю свернуть полемику или перенести её в раздел «Обмен опытом»... а то мы тут сейчас всю ветку за... своим разговором, не имеющим дело к теме.
 
Visual Studio C++ очень тяжёлый.
JetBrains CLIon подойдёт?
---
В Code Blocks можно выбирать разные компиляторы. Разве это не то что нужно?
 
Цитата
Suntor написал:
опять философия..
Цитата
Suntor написал:
Предлагаю свернуть полемику или перенести
выбираю - свернуть, тк беседовать интересно с философами, а Ваше мнение о том, что написали в книгах другие мне не интересно.
до встречи в стакане.
 
Цитата
Let_it_go написал:
Visual Studio C++ очень тяжёлый.
JetBrains CLIon подойдёт?
---
В Code Blocks можно выбирать разные компиляторы. Разве это не то что нужно?
CLion -- платная.

Студия -- де-факто стандарт IDE для разработки на плюсах под винду. Ставьте бесплатную Community Edition -- хватит за глаза.Ну, и Ваш скрин от Code::Blocks позволяет предположить, что собирать в ней можно любым из предложенных инструментов. Теперь разве что осталось посмотреть, как там в принципе настроить доп. директории для компилятора и линкера и всё -- можно собирать без замусоривания стандартной директории библиотечными файлами.
 
Цитата
Suntor написал:
стек, куча, мантисса, сортировки, деревья, Дональд Кнут был настольной книгой, свою первую программу вообще в машинных кодах писал...
Поржал.
Понт защитан.
 
Цитата
Let_it_go написал:
В Code Blocks можно выбирать разные компиляторы. Разве это не то что нужно?
Это выбор внутренней конфигурации под требуемый компилятор, но саму конфигурацию нужно ещё настраивать и сам компилятор отдельно устанавливать... выше я кинул уже ссылку на PDF, где описано, как это делать.
Цитата
Imersio Arrigo написал:
Поржал.
Понт защитан.
)))
 
Suntor
пытаюсь запусить ваш код dll в Visual Studio 2017 Community
Такая ошибка возникает при нажатии на "собрать решение".
Спасибо за помощь.  
 
Сначала он ругался на отсутствие lua.h и других. Я их добавил через "Дополнительные каталоги включаемых файлов".
 
Цитата
Let_it_go написал:
Suntor
пытаюсь запусить ваш код dll в Visual Studio 2017 Community
Такая ошибка возникает при нажатии на "собрать решение".
Спасибо за помощь.
Сначала гуглите, потом задавайте вопрос -- велика вероятность, что ответ уже содержится в Интернете. Например, тут: https://habr.com/company/pvs-studio/blog/227521/


TL;DR: для Ваших экспериментов Вам лучше будет отключить использование предкомпилированных заголовков.
 
Цитата
Let_it_go написал:
Suntor
пытаюсь запусить ваш код dll в Visual Studio 2017 Community
Такая ошибка возникает при нажатии на "собрать решение".
Спасибо за помощь.
У вас включена опция использования предварительно скомпилированных файлов заголовков. Её надо отключить. У меня нет под рукой студии такой же версии, поэтому не могу вам сходу указать, где эта опция отключается. Ищите по названию «Precompiled headers»... в старой VS6.0 это выглядит так:
 
Поставил Visual Studio Community
пытаюсь скомпилировать dll в примере Suntor
---
Файлы заголовков включил


---
но он выдаёт такие ошибки
1>------ Сборка начата: проект: easy_c, Конфигурация: Release Win32 ------
1>easy_c.cpp
1>d:\_c++\easy_c\easy_c\easy_c.cpp(41): fatal error C1010: непредвиденный конец файла во время поиска предкомпилированного заголовка. Возможно, вы забыли добавить директиву "#include "stdafx.h"" в источник.
1>Сборка проекта "easy_c.vcxproj" завершена с ошибкой.
========== Сборка: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

и список ошибок:
 
p.s. #include "stdafx.h добавил в шапку кода, теперь он на это не ругается.
Страницы: 1
Читают тему
Наверх