Alexander (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 2 3 4 5 6 След.
Выгрузка библиотек
 
Цитата
nikolz написал:
Удачная компиляция dll, хотя тест запущен как и во втором случае, но после вызова Вашей функции вызвана моя функция выгрузки dll.
А хэндл для выгрузки DLL, которая выгружает основную, она как по имени получает?
Выгрузка библиотек
 
Цитата
Вадим Никитин написал:
Безусловно, можно выгрузить библиотеку и принудительно. Для этого можно найти HANDLE библиотеки по её имени, что-то вроде GetModuleHandle и вызвать FreeLibrary с ним.
Есть такая функция, которая по имени выдаёт хэндл для библиотеки?
Выгрузка библиотек
 
Цитата
Вадим Никитин написал:
Как уже упомянуто, библиотека в адресном пространстве процесса присутствует в единственном экземпляре. То есть, если несколько скриптов используют одну библиотеку и запускаются из одного процесса QUIK, то все они будут использовать одну и ту же копию библиотеки.
Ну я с этим полностью согласен и знаю это.
Цитата
Вадим Никитин написал:
Для того, чтобы выгрузить библиотеку, процесс, в адресном пространстве, которого она находится, должен вызвать FreeLibrary ровно столько раз, сколько раз она была загружена, уменьшая счётчик ссылок. Когда счётчик ссылок обнулится, то ОС выгрузит библиотеку и освободит файл.
Здесь мне кажется не совсем верно написали. В адресное пространство процесса отображается DLL, когда он её загружает через LoadLibrary например. Он её может и выгрузить через FreeLibrary, но это не значит, что ОС выгрузит её, так как другие процессы могли так же загружать её. И ОС ведёт этот счётчик сколько раз её загружали через LoadLibrary разные процессы. И когда последний процесс вызовет FreeLibrary, тогда и счётчик ОС для этой библиотеки обнулится и ОС выгрузит её опять же когда сочтёт нужным. Наверное это имелось в виду. Или что, разные потоки одного процесса могут вызывать каждый LoadLibrary, и потом каждый из них должен вызывать FreeLibrary? Или если в цикле например в одном потоке вызвать несколько раз LoadLibrary, то мне потом надо столько же раз вызвать и FleeLibrary для успешной выгрузки? Пример с общей глобальной переменой понимаю, вернее знаю про это.
Выгрузка библиотек
 
Цитата
nikolz написал:
Цитата
Alexander написал:
 
Цитата
nikolz  написал:
Я Вроде вам написал, что сделать. Вы сделали? Какой результат?Если не выгрузилась, то скажу что делать дальше.
 Что ещё попробовать?
В свободное время протестирую Вашу dll (приведенную Выше) и напишу Вам результат.
------------------------
Могу выложить готовую dll для выгрузки вашей библиотеки .
Да, если можно, скиньте. Посмотрю, может что прояснит для меня. На любое облако для прямого скачивания типа яндекса или майлру, а ссылку здесь можно или в ЛС.
Выгрузка библиотек
 
Цитата
Kalmar написал:
Цитата
Alexander написал:
extern "C" LUALIB_API int luaopen_luacdllopt(lua_State *L) {
#if LUA_VERSION_NUM >= 502 luaL_newlib(L, ls_lib);
#else luaL_openlib(L, "luacdll", ls_lib, 0);#endif return 1;
}
я так понимаю, что это код внутри твоей либы, ты объявляешь функцию и ее просовываешь в луа, верно?
чтобы иметь возможность делать так:
Цитата
Alexander написал:
luacdllopt = require("luacdllopt")

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

Если да, то мне кажется есть путь проще: нужно сделать dll-обертку, для работы с твоей целевой dll-кой, которая может делать LoadLibrary/FreeLibrary, и после загрузки твоей либы она биндит адреса функций в тестовой dll, на какие-то луа-методы.

Все  вызовы lua_mycallN находятся в обертке, но реально делают вызов из целевой либы.Я могу ошибаться в деталях, и имена вызовов условны, для понимания что к чему.

При этом работа происходит примерно так:
1. загружаем luamywrap.dll, она содержит какое-то кол-во целевых вызовов, ну, для которых ты все это затеял, и две специальных процедуры:
lua_LoadMyLib(name) -- она делает LoadLibrary, сохраняет ее хендл где-то у себя и биндит реальные адреса процедур MyCallN в функции-обертки lua_mycallN.
lua_UnLoadMyLib(name) -- она делает FreeLibrary для хендла полученного при загрузке либы, и сбрасывает указатели в lua_mycallN, чтобы небыло падежей в случае случайного вызова.
2. делаем вызов lua_LoadMyLib(myDLLName).
3. теперь можно работать вызывая из луа lua_mycallN  - они будут работать как надо.
4. когда закончили - вызываем lua_UnLoadMyLib(), целевая dll выгружается и можно с ней что-то делать.
5. ????
6. profit!
Всё верно по поводу вопроса в самом начале сообщения. Всё, что Вы описали я уже проделал в разных вариантах и именно в варианте как у вас тоже, ранее об этом писал здесь: https://forum.quik.ru/messages/forum10/message69406/topic4425/#message69406 Всё дело в том, что выгрузка то происходит без ошибок, т.к. FreeLibrary ошибок не выдаёт, скрипт заканчивается, более DLL никто не использует, все ресурсы освобождены, но вот файл библиотеки я удалить так и не могу. Что в обёртке, что в самовыгрузке, - тоже писал ранее - результат один и тот же. Выгрузка без ошибок, файл не удаляется. За совет конечно спасибо.
Нужно создать робота на QPILE. ( за оплату ), Кто сможет сделать робота сканер по RSI ?
 
Так нужна только таблица, чтобы визуально наблюдать? Или нужен именно робот, чтобы ещё и сам покупал - продавал? Или купил-продал вручную?
Выгрузка библиотек
 
Цитата
nikolz написал:
Я Вроде вам написал, что сделать. Вы сделали? Какой результат?Если не выгрузилась, то скажу что делать дальше.
Что ещё попробовать?
Выгрузка библиотек
 
Цитата
Alexander написал:
[img]data:image/png;base64,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[/img]
Картинка из буфера почему-то не вставилась. Хотя когда писал и вставил, то картинка нормально отобразилась в окне где пишу.
Выгрузка библиотек
 
[img]data:image/png;base64,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[/img]
Выгрузка библиотек
 
nikolz, выяснилось ещё вот что - оказывается даже потоки мои здесь вообще не причём и всякие там выделения ресурсов тоже ни причём. Вот код простейший DLL:

#include <windows.h>
#define LUA_LIB
#define LUA_BUILD_AS_DLL
#include "lua.hpp"

//==========================================================­============================================================­=================
BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD fdwReason, LPVOID lpReserved)
{
switch (fdwReason) {
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hModule);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
OutputDebugString((LPCWSTR)L"Disable DLL");
break;
}
return TRUE;
}
//==========================================================­============================================================­=================
static int forLua_GetCurrentThreadId(lua_State *L) {
OutputDebugString(L"luacdllopt[forLua_GetCurrentThreadId]: GetCurrentThreadId() function is called...");
lua_pushinteger(L, GetCurrentThreadId());
return(1);
}
//==========================================================­============================================================­=================
static struct luaL_Reg ls_lib[] = {
{ "GetCurrentThreadId", forLua_GetCurrentThreadId },
{ nullptr, nullptr }
};
//==========================================================­============================================================­=================
extern "C" LUALIB_API int luaopen_luacdllopt(lua_State *L) {
#if LUA_VERSION_NUM >= 502
luaL_newlib(L, ls_lib);
#else
luaL_openlib(L, "luacdll", ls_lib, 0);
#endif
return 1;
}

В скрипте вызываю:

package.cpath =  package.cpath .. ";" .. getWorkingFolder() .. "\\lib5" .. _VERSION:sub(_VERSION:len()) .. "\\?.dll"
luacdllopt = require("luacdllopt")

PrintDbgStr("1) GetCurrentThreadId() = " .. tostring(luacdllopt.GetCurrentThreadId()))

Уж куда ещё проще то. И после пробую удалить файл библиотеки - не удаляется! И ещё всё время удалять пробовал через Total Commander. А он типа не могу и всё - снимите защиту от записи. А тут попробовал удалить Проводником и выдал он мне следующее:



Так что то это? Квик значит виноват? Он не даёт удалить потому, что держит файл открытым.
Выгрузка библиотек
 
Наверное есть счётчик потоков подключённых и его надо как-то сбросить.
Выгрузка библиотек
 
nikolz, попробовал вставил вызов DisableThreadLibraryCalls после case DLL_PROCESS_ATTACH: как Вы писали - результат отрицательный. Потоки перестали подключаться и отключаться к моей DLL, ну вернее перестали приходить сообщения из DLL_THREAD_ATTACH и DLL_THREAD_DETACH, что я оттуда делал в debug, ну и деактивировался мой код в  DLL_THREAD_DETACH, который закрывал дескрипторы завершённых потоков. Файл библиотеки удалить не могу.
Выгрузка библиотек
 
Цитата
nikolz написал:
Alexander ,
У меня все это работает.
Но если Вы будете сами выдумавать а не делать ровно то что я написал, то не вижу смысла Вам помогать.
Хорошо, сейчас попробую в точности. Может я не правильно понял как эта функция работает.
Выгрузка библиотек
 
Я сейчас попробую сделать вызов DisableThreadLibraryCalls не в в функции  WINAPI DllMain(HINSTANCE hinstDLL ...
после
         case DLL_PROCESS_ATTACH:
как Вы писали, а в другом месте - в вызове функции, которая закрывает все работающие потоки если таковые есть.
Выгрузка библиотек
 
nikolz, что ещё можно?
Выгрузка библиотек
 
Цитата
nikolz написал:
Цитата
Alexander написал:
Такой прокси вызов функций из основной DLL, как описал выше так же можно организовать и по другому, т.е. не возвращая адрес нужной функции в скрипт с последующим вызовом функции через переменную, получившую адрес этой функции. А можно вызывать функции как обычно через имя модуля.имя функции, но эти функции надо сделать прокси-функциями, т.е они должны принимать все нужные параметры для вызова, а потом через переменную указатель вызывать нужную функцию из основной DLL, передавая ей эти параметры обычной функции C. Но это просто к слову. Так не стал, хотя разницы нет. Всё равно же результат никакой.
Я Вроде вам написал, что сделать. Вы сделали? Какой результат?
Если не выгрузилась, то скажу что делать дальше.
Рад бы вобщем такое попробовать, но не могу, мне нужен DLL_THREAD_DETACH. Ещё есть подозрение, что вызов DisableThreadLibraryCalls cделает так, что DLL_THREAD_ATTACH и DLL_THREAD_DETACH просто не будут приходить в DLL, но сами потоки будут и присоединяться и отсоединяться, просто уведомлений не будет.
Выгрузка библиотек
 
Кстати, а есть ли такая функция, которая бы запрещала бы вообще присоединяться к моей библиотеке другим потокам? А то кроме потоков, которые я сам запускаю к ней присоединяются все кому не поподя - какие-то потоки квика или луа, которые мне не нужны. Это было бы полезно для меня, хотя проблему не решает, просто чужие потоки забивают мне отладочный вывод. Можно конечно каждый раз сравнивать свой-чужой, но это лишний код.
Выгрузка библиотек
 
Цитата
nikolz написал:
попробуйте в dll ,которую надо выгрузить
в функции  WINAPI DllMain(HINSTANCE hinstDLL ...
после
          case DLL_PROCESS_ATTACH:
вставить
DisableThreadLibraryCalls(hinstDLL);G
Посмотрел, что это за функция. Это мне не пойдёт, т.к. у меня в DLL_THREAD_DETACH происходит удаление дескрипторов потоков из массива потоков, которые закрылись. Если сделаю её вызов, то DLL_THREAD_DETACH мне поступать не будут.
Выгрузка библиотек
 
Такой прокси вызов функций из основной DLL, как описал выше так же можно организовать и по другому, т.е. не возвращая адрес нужной функции в скрипт с последующим вызовом функции через переменную, получившую адрес этой функции. А можно вызывать функции как обычно через имя модуля.имя функции, но эти функции надо сделать прокси-функциями, т.е они должны принимать все нужные параметры для вызова, а потом через переменную указатель вызывать нужную функцию из основной DLL, передавая ей эти параметры обычной функции C. Но это просто к слову. Так не стал, хотя разницы нет. Всё равно же результат никакой.
Выгрузка библиотек
 
Добавлю ещё. Попробовал такой вариант. Написана ещё одна DLL для загрузки основной. Скрипт через require грузит её, та в DLL_PROCESS_ATTACH через LoadLibrary загружает основную DLL. Есть функция в DLL, которая загрузила основную, которая возвращает мне адрес любой функции из основной DLL по имени функции, этот адрес она передаёт через lua_pushcfunction, а скрипт сохраняет в переменную и потом я через эту переменную вызываю функцию из основной DLL. Всё работает. Проверено. Точно так же как если бы я вызывал функции напрямую из первой. Далее вызываю из скрипта функцию, которая выгружает основную через FreeLibrary. Вот тут самое интересное. Выгрузка происходит нормально, ошибок нет, НО... результат такой же как в п.3, что пару постов выше - файл DLL так и не удалить!!! Удалить можно только после выхода из QUIK-а. Получается, что так, что выгружать DLL из самой себя - результат одинаковый - положительный, но на самом деле нихрена не положительный раз файл удалить нельзя.
Выгрузка библиотек
 
Цитата
nikolz написал:
Alexander ,
Добрый день,
Объясняю как это сделать.
----------------------
1) Вам надо написать отдельную dll, в которой одна функция - выгрузить dll по ее имени
-------------------------
2) в этой функции вам надо найти хендл выгружаемой dll и выгрузить ее столько раз, сколько ее вызывали до этого.
---------------------
3) При сборке dll, которую Вы будете в дальнейшем выгружать, вам надо отключить оповещение о вызове этой dll
----------------
И будет вам счастье.
Постом выше я описал, что уже было предпринято. В п.2 я как раз делал тоже самое. Отдельная DLL написана, там одна функция на выгрузку. Хэндл DLL есть - получаю запросом из первой. Не выгружается. По поводу - выгрузить столько раз, сколько её вызывали до этого. Библиотека загружается один раз и висит не выгружается. Наверное имелось ввиду столько раз сколько запускался скрипт, который её грузит в начале через require? По п.3 - как отключить оповещение о вызове этой DLL?
И ещё. Вспомнил, что ранее как только первый раз написал свою DLL для QUIK, она ВРОДЕ как сама выгружалась после отработки скрипта. Но потом выгрузок не было, когда писал DLL, где запускались потоки.  Точно ответить не мог точно выгружалась или нет. Но вот когда писал DLL, которая выгружает основную DLL, то при завершении скрипта, я мог удалить файл этой  DLL, а вот удалить файл основной DLL, которую надо удалить так и не получалось. Сделал выводы, что какие-то ресурсы не освобожены, поэтому DLL и висит. Но я уже всё предусмотрел, выгружаю и закрываю всё что открывал и использовал. У меня запускаются потоки, они выделяют память, потоки перед завершением память освобождают, сами завершаются, так же использовал TLS, тоже освобождаю, дескрипторы потоков закрываю. Инициализацию делал критической секции, - удаляется. Что ещё может быть не знаю. Короче что использовал, то освободил или закрыл. Что мешает Lua выгрузить не пойму пока.
Выгрузка библиотек
 
Сегодня сделал несколько попыток выгрузить мою DLL загруженную моим скриптом.
1) Написал отдельную программу(скомпилял с hModule = const, - взял из отладочного вывода, где DLL выводит свой hModule при загрузке), которая делает FreeLibrary DLL, результат не успешный, GetlastError = 126 (Не удалось найти указанный модуль), из другого пространства процесса видимо не катит.
2) Написал отдельную DLL для выгрузки DLL, в которой скрипт вызывает так же FreeLibrary(hModule скрипт получает вызовом функции из удаляемой DLL и передаёт его DLL, которая должна удалить удаляемую DLL), -  результат не успешный, GetlastError = 126 (Не удалось найти указанный модуль). Тут DLL вроде в пространстве того же процесса, но видимо нельзя удалить не свой модуль.
3) Вызов скриптом функции, которая  в самой DLL и она вызывает FreeLibrary(т.е. по сути DLL выгружает сама себя), результат выполнения функции как ни странно - Успешное выполнение( ! = 0), но удалить фай DLL из каталога так и не удаётся, только после выхода из QUIK.
4) То же самое, что и п.3, плюс вызов UnmapViewOfFile, результат - QUIK вылетает(слышно как шуршит hdd, идёт полная выгрузка), но вылет понятен - после UnmapViewOfFile по сути управление команде после UnmapViewOfFile уже не передать - кода в памяти уже нет.
5) То же самое, что и п.3, но вызов UnmapViewOfFile  вызовом функции из другой DLL(hModule скрипт получает вызовом функции из удаляемой DLL и передаёт его DLL, которая должна удалить удаляемую DLL), - результат GetlastError = 487 (Попытка обращения к неверному адресу).
7) То же самое, что и п.3, плюс collectgarbage(), результат такой же как у п.3
8) То же самое, что и п.3, плюс:
    package.loaded["luacdllopt"] = nil
   _G["luacdllopt"] = nil
 , результат такой же как у п.3
9) То же самое, что и п.8, плюс collectgarbage(), результат такой же как у п.3

На этом сделал вывод, что нужен только либо явный вызов FreeLibrary оттуда, откуда был LoadLibrary, а этого нет, либо UnmapViewOfFile нужна оттуда же, чего тоже не можем иметь(хотя если бы и имели, то просто воспользовались бы FreeLibrary). Либо должен быть какой-то способ заставить Lua всё нормально почистить - ведь п.3 имел таки успешный результат, поэтому я полагаю, что выгрузка произошла, но отвязка файла не сделана, что и не даёт нам его удалить. Есть у кого ещё какие мысли что ещё можно попробовать? Должен же быть какой-то выход - скрипт загрузил, скрипт отработал, по сути DLL никому не нужна. Решение должно быть.

PS. Пока писал ещё мысль такая пришла - пишем одну DLL, загружаем её в скрипте, эта DLL ничего не делает кроме как через LoadLibrary грузит основную DLL(раз сама загрузила, то сама должна и выгрузить), в которой все нужные нам функции. Но как вызывать функции из основной потом? Если найдётся решение, то может и получится потом выгружать основную. Главное выгружать основную, так как её постоянно надо перекомпилировать и менять файл на новый, а первая путь себе и не удаляется. Наспех что-то на ум ничего не идёт как вызывать, надо собраться с мыслями.

PSS. А не вроде можно вызывать. В первой DLL пишем ещё одну функцию через которую будем вызывать любую функцию из первой DLL, блин ну как это заморочено всё получается. Но придётся видимо и так попробовать.

PSSS. Или после загрузки основной DLL, адреса всех функций возвращать в скрипт и потом использовать адреса для вызова, но тоже заморочено.
Лучше бы конечно сам Lua заставить выполнить свою работу.
Выгрузка библиотек
 
Вот что интересно, а разработчики могут что-нибудь по этому вопросу посоветовать? Понятное дело, что квик - это квик, а Lua - это Lua, но всё-таки.
Выгрузка библиотек
 
Цитата
Nikolay Pavlov написал:
И еще один момент, при завершении скрипта модули автоматически выгружаются.
Я вот за это зацепился. Раз человек такое писал, значит выгрузка автоматом была. На данный момент моё видение по этому вопросу следующее. При отладке я вижу, что после загрузки моей библиотеки помимо того, что я запускаю свои отдельные потоки, которые присоединяются к этой DLL, так же время от времени к моей библиотеки присоединяются потоки самого квика, которые он запускает. Я вижу как при завершении потока происходит его отсоединение от моей DLL, и как отсоединяются от неё потоки квика, которые ранее к ней присоединились. Но проблема в том, что свои потоки я могу завершить, а вот потоки квика я не контролирую. В любой момент времени постоянно есть какой-то из потоков квика, который присоединён к моей библиотеке. Это делает сама система. Таковы её правила видимо - все вновь созданные потоки из пространства процесса присоединять к DLL, работающей в пространстве этого процесса. Они постоянно подключаются, отключаются, я это контролирую по их ID, но всегда есть потоки присоединённые и никак не возникает ситуация когда все потоки отсоединились. Вот думаю можно ли програмно в самой DLL как-то не разрешать "чужим" подключаться к ней или как-то принудительно их отсоединять. Возможно, когда писалось это, то в тот момент не было ни одного потока присоединённого к DLL и по завершению скрипта квик выгружал DLL, но то было раньше и квик был другой версии и потоки были там по другому организованы чем сейчас. Вот если добиться отсоединения всех потоков, то возможно квик и выгрузит DLL. Но я же не могу запретить квику запускать потоки. А может это и не квика потоки, а Lua, - не понятно. И поэтому может даже сторонняя выгрузка явно не поможет пока есть хотя бы один поток, присоединённый к DLL. Может можно как-то права доступа организовать к воей DLL только своим потокам, но так глубоко я не вникал, да и не хотелось бы, но видимо придётся. Поэтому пока будем думать дальше, уж больно напрягает это всё - перезагрузки для каждой повторной компиляции.
Выгрузка библиотек
 
Цитата
Станислав написал:
Цитата
Kalmar написал:
 
Цитата
paluke  написал:
Вызвал сборщик мусора.
 ЗЫ: а его можно явно вызвать? Он же вроде сам приходит когда считает нужным?
collectgarbage()
А вот это интересно, надо с ним поэксперементировать.
Выгрузка библиотек
 
Цитата
Kalmar написал:
Цитата
paluke написал:
 https://github.com/lua/lua/blob/master/loadlib.c#L20  4
А ее ктото вызвал?

Цитата
paluke написал:
Ну и про выгрузку выше   https://forum.quik.ru/messages/forum10/message37303/topic4425/#message37303  
Нет желания проводить эксперименты.

К тому же, я незнаю как работает вся эту луашная магия:

Цитата
function unrequire(m)
 package.loaded[m] = nil
 _G[m] = nil
end
Я вижу тут зануление таблиц.
Приводит ли это к выгрузке модулей - неизвестно.
Я это пробовал - никакого толку. Выгрузка не происходит. И способ действительно извращённый. Внаглую занулить таблицу. И что там когда какой сборщик вычистит - не понятно. Вызова самого сборщика я тут не вижу.
Выгрузка библиотек
 
Цитата
paluke написал:
Цитата
Kalmar написал:
 
Цитата
paluke  написал:
Вообще-то в исходниках lua есть вызов FreeLibrary. Вроде бы gc должен ее вызывать, когда библиотека больше не используется
 Кто такое сказал?
И как ваще GC должен понять про твою либу, которую ты загрузил для себя??
 https://github.com/lua/lua/blob/master/loadlib.c#L20 4
Ну в исходниках есть, а толку то? Я могу вызвать её из своего скрипта?
Выгрузка библиотек
 
Цитата
Kalmar написал:
Цитата
Alexander написал:
Попробую поднять данную тему вновь. Вобщем всё что выше написано - не работает Библиотека не выгружается!.
Явный вызов FreeLibrary для твоей либы (которую ты загрузил в скрипте, не так ли?) - не работает?

Или когда ты ожидаешь что либа будет отгружена? Автоматически, по завершении/отмене скрипта? Такого нет.
Нужно явно выгружать либу. Ну и конечно, если либа выгружена, а ты к ней будешь обращаться - все попадает :)
Как же я могу сделать явный вызов FreeLibrary для своей библиотеки из своего скрипта, который её загрузил? Я могу вызвать функцию из скрипта свою из этой своей библиотеки и там сделать вызов FreeLibrary этой библиотеки, но что это будет за абсурд? Из тела библиотеки вызывать выгрузку самой этой библиотеки? Библиотека в своём коде будет пытаться попросить систему выгрузить саму себя?
Выгрузка библиотек
 
Цитата
nikolz написал:
Цитата
Alexander написал:
Попробую поднять данную тему вновь. Вобщем всё что выше написано - не работает Библиотека не выгружается!. Библиотека на C++. Выше писали, что типа если на чистом C++ то выгружается нормально. Не выгружается. Есть ли ещё какой способ выгрузить свою же DLL, которую Lua выгружать почему-то не хочет. Странное вообще какое-то поведение Lua. Скрипт отработал, библиотека - осталась. Функций в Lua для выгрузки не нашёл, что тоже довольно таки странно. Загружать значит можно, выгружать нет. Приходится постоянно перезагружать QUIK, чтобы удалить файл DLL, поскольку система не даёт его удалить, пока библиотека используется Lua. А удалять файл надо, чтобы после перекомпиляции DLL, новый DLL-файл записать на место  того, что надо удалить. Это сильно напрягает поскольку сам QUIK грузится не быстро. Сталкивался кто с таким? Как ещё можно решить пролему? Ведь библиотека же чисто моя, зачем она вообще удерживается Lua - не понятно. Закончился скрипт без ошибок - освободи, но нет. Уж не знаю как решить, думаю уже как-то искать ID библиотеки, ну или там хэндл какой и выгружать отдельно программой через API винды.
А причем здесь скрипт?  
Скрипт - это даже не программа, а все лишь байткод для луа машины.
Вспомните, когда dll выгружается.
Ну в случае квика загрузка происходит явно через LoadLibrary. Поэтому могли бы и предусмотреть и аналог FreeLibrary. После его вызова там конечно как система соизволит, так и выгрузится. Библиотека же твоя - захотел загрузил, захотел  - выгрузил.
Какая кодировка используются в Lua?
 
Цитата
paluke написал:
Цитата
swerg написал:
Alexander, строки текста откуда берутся? в cpp файле в тексте программы?
А cpp-файлы в какой кодировке-то у вас сохранены? сможете определить?
Так то кодировка исходника может отличаться от кодировки, в которой будет строка после компиляции  https://learn.microsoft.com/en-us/cpp/build/reference/execution-charset-set-execution-character-set?...
Да, я когда разбирался со всем этим, то как раз тоже на это пояснилово от Майкрософта наткнулся - этим и воспользовался потом.
Какая кодировка используются в Lua?
 
Короче я разобрался. Оказывается все исходники у меня были на ANSI, а вот один файл был на UTF-8. Как так получилось, что я его сохранял специально  в ANSI и потом компилял весь проект и тоже не работала - не пойму. Что-то по запарке видимо не то сделал, поэтому и промучился долго. Раньше так и делал. Весь код в ANSI изначально и сто процентов выведет на русском, тем более QUIK в 1251 работает. А студия файлы по разному может сохранять. Вот этот почему-то по умолчанию в UTF-8 сделала, а другой проект отдельно делал - там студия сама ANSI сохранила. Но я не стал заморачиваться с перекодировками, я просто флаги компилятору указал, чтобы исходники все как UTF-8 сохранял, а кодировку выполнения делал во время компиляции как cp1251. При компиляции много сообщений, что не может некоторые символы из ANSI файлов в UTF-8 переделать(там русские комменты были), поэтому ANSI-шные так и остались как есть, а один файл он был в UTF-8 уже, тоже получается остался как есть, но зато русский код сразу мне во время компиляции сгенерил в cp1251 и всё сейчас работает. На будущее сразу надо не забывать проверять и желательно всё в ANSI, чтобы без проблем или компилятору указывать флаги на нужную кодировку выполнения - то есть то что будет в скомпилированной программе на выходе после компилятора и в какой кодировке.
Не выводил потому, что в UTF-8 был русский закодирован на время выполнения, поэтому ни MessageBoxA, ни MessageBoxW естественно не могли его раскодировать, так как у Microsoft MessageBoxW типа широкие символы, и типа это UTF кодировка, но не та, у них wide char это UTF-16LE двухбайтовый. А UNF-8 от только английские символы одним байтом кодирует и если всё на английском, то будет одинаково, что на ANSI, что на UTF-8. Эти юникоды разные варианты есть. UTF-8 он кодировать может 1-4 байт на символ, UTF-16 от 2-4 байт на символ, а ещё BE или LE, UTF-32 там строго 4 байта на символ и тоже BE или LE.
Обновление пользовательской таблицы/окна
 
И у меня там цикл в main шибко многочисленный на вызова подряд функций, вызовов много, так что от начала цикла до конца проходит видимо очень много времени и это видимо тоже как-то влияет. При тыке мышкой по шапке окна видимо обработчик мыши срабатывает, и он заставляет перерисовать окно и WM_PAINT перерисовывает, а по другому нет - жди очереди, а очередь всё никак не приходит, потому, что постоянно квик пролетает мимо в цикле по причине всех этих слотов времени и задержек, которые никак не могут коррекектно работать между собой в теле цикла квика.
Обновление пользовательской таблицы/окна
 
nikolz, если
Цитата
nikolz написал:
если взять пример выше и убрать последний параметр в функции SetCell и Highlight , то все обновляется. Может пример другой кто-нибудь напишет?
Тут всё видимо у всех по разному. И всё связано с тем как они обновляют содержимое таблиц. Ведь вся программа квика - это один огромный цикл где каждой операции выделяется слот времени и вот видимо если код скрипта по своей продолжительности успевает как-то вклиниться между слотами времени, то на следующей итерации квик обновит буфера таблицы, если нет - то постоянно квик проходит "мимо". Здесь надо знать сам алгоритм как у них там всё организовано.
Обновление пользовательской таблицы/окна
 
Сюда что-то и не заходил давно. Да 5 параметров. Перепутал видимо. В общем обновляется хоть как-то когда когда SetCell с 5-ю параметрами, в конце просто ставлю 1-цу, иначе не обновляется и Highlight подсветка обязательно и строка с подсветкой должна быть внутри таблицы в видимой части. А вообще это или криво работает WM_PAINT в оконной процедуре таблицы, либо WM_PAINT отрабатывает по честному, но данные для отображения в буфере не обновляются как положено, без исходников не поймёшь.
Какая кодировка используются в Lua?
 
Цитата
nikolz написал:
правда я встроил LuaJIT в QUIK и могу использовать и FFI.Тоже об этом писал на форуме.
Есть прямая ссылка на тему, как этот JIT прикрутить к квику?  
Какая кодировка используются в Lua?
 
Если имелось ввиду заменить MessageBox  на MessageBoxA, так я так уже пробовал. По умолчанию да юникод в свойствах проекта и функция из макроса MessageBox подставляется MessageBoxW, я это знаю. Замена ничего не меняет абсолютно. MessageBox, что один, что другой вызываются из оконной процедуры у меня.
Какая кодировка используются в Lua?
 
Ну так у меня и есть dll на основе API C for Lua, но только результат совсем не такой как хотелось бы.
Цитата
nikolz написал:
Просто сделайте как я Вам написал и увидите результат.
Что именно сделать? Перейти на аналог ffi? Если это имелось в виду, то это надо отдельно сейчас вникать в эту тему. Несомненно тема того стоит, изучить надо её. Но думаю, что всё что мне хотелось бы этот подход не решит. Мне напрмер нужно своё окно со своей callback оконной процедурой, потому, что в неё онлайн будут со скрипта QUIK-а поступать данные и она будет рисовать мне опционные стратегии в онлайн режиме. Трансляция цен на покупки-продажи опционов по бидам и офферам, смотря что надо - покупать или продавать и страйки и база и по этим данным график будет меняющийся на глазах в зависимости от этих данных.
Какая кодировка используются в Lua?
 
Ошибочка в ссылке. Мой подход: https://quik2dde.ru/viewtopic.php?id=18
Какая кодировка используются в Lua?
 
Тут я кажется кое-что пряснил для себя. Вы, видимо используете этот подход: https://forum.quik.ru/forum10/topic7971/, тем более сами писали. Я правильно понял? Я использую этот подход: https://forum.quik.ru/forum10/topic7971/
Хотелось бы решить задачу в своём подходе.
Какая кодировка используются в Lua?
 
nikolz, у Вас что за функции nkcf.defF и rfs ? Какой их код, что они вызывают API винды? И Вы их вызываете прямо из скрипта, а я API прямо из DLL на C.
Какая кодировка используются в Lua?
 
Цитата
nikolz написал:
Цитата
Alexander написал:
Аааа, я ещё что-то сразу то не приметил.   nikolz  , Вы  на скрине показываете окно сообщений самого квика. Мои скрипты в это окно пишут по-русски нормально. Я писал не про это окно. У меня DLL. Скрипт вызывает её функции. Эти функции например вызывают MessageBox виндовую для вызова окна сообщенй винды с русским текстом. И вот оно то пишет не по-русски. Вот в этом проблема. А с простым message в скрипте проблем нет - сохраняю с русскими сообщениями как ANSI и проблем нет. Вобщем сама винда перестаёт по-русски писать в своём же сообщении, хотя если вызывать  не из библиотеки DLL под QUIK, а просто из программы под винду, то пишет по-русски как положено. И ещё. Из DLL в этом окне только само сообщение абракадаброй выводится, а вот кнопки "Да", "Нет" - они нормально по-русски подписаны.
попробуйте вызвать MessageBoxA
Да я по всякому уже перепробовал, пробовал я и W варант и A вариант MessageBox-а, и просто коды букв вставлял для cp1251 из таблицы символов. Ни так, ни как не выводят по русски. Скрины:
Выгрузка библиотек
 
Попробую поднять данную тему вновь. Вобщем всё что выше написано - не работает Библиотека не выгружается!. Библиотека на C++. Выше писали, что типа если на чистом C++ то выгружается нормально. Не выгружается. Есть ли ещё какой способ выгрузить свою же DLL, которую Lua выгружать почему-то не хочет. Странное вообще какое-то поведение Lua. Скрипт отработал, библиотека - осталась. Функций в Lua для выгрузки не нашёл, что тоже довольно таки странно. Загружать значит можно, выгружать нет. Приходится постоянно перезагружать QUIK, чтобы удалить файл DLL, поскольку система не даёт его удалить, пока библиотека используется Lua. А удалять файл надо, чтобы после перекомпиляции DLL, новый DLL-файл записать на место  того, что надо удалить. Это сильно напрягает поскольку сам QUIK грузится не быстро. Сталкивался кто с таким? Как ещё можно решить пролему? Ведь библиотека же чисто моя, зачем она вообще удерживается Lua - не понятно. Закончился скрипт без ошибок - освободи, но нет. Уж не знаю как решить, думаю уже как-то искать ID библиотеки, ну или там хэндл какой и выгружать отдельно программой через API винды.
Какая кодировка используются в Lua?
 
Аааа, я ещё что-то сразу то не приметил. nikolz, Вы  на скрине показываете окно сообщений самого квика. Мои скрипты в это окно пишут по-русски нормально. Я писал не про это окно. У меня DLL. Скрипт вызывает её функции. Эти функции например вызывают MessageBox виндовую для вызова окна сообщенй винды с русским текстом. И вот оно то пишет не по-русски. Вот в этом проблема. А с простым message в скрипте проблем нет - сохраняю с русскими сообщениями как ANSI и проблем нет. Вобщем сама винда перестаёт по-русски писать в своём же сообщении, хотя если вызывать  не из библиотеки DLL под QUIK, а просто из программы под винду, то пишет по-русски как положено. И ещё. Из DLL в этом окне только само сообщение абракадаброй выводится, а вот кнопки "Да", "Нет" - они нормально по-русски подписаны.
Какая кодировка используются в Lua?
 
Цитата
nikolz написал:
Цитата
Alexander написал:
За столько времени так никто и не ответил. Поддержка может хоть что-нибудь подсказать в решении проблемы? Мой вывод : в контексте толи потока QUIK, толь в Lua, локаль меняется с ru-Ru на локаль C, а в ней видимо русских букв вообще нету. Поэтому хоть что ты пиши, хоть кодируй текст - всё равно толку не будет, так как его попросту в чарактер сет(кодировке) нет как такового. Но почему не получается сначала  сохранить локаль C, потом установить родную локаль, вывести текст, потом локаь C вернуть обратно - не пойму.
никогда не было проблемы с русскими буквами. Полагаю кодировка, которая в системе установлена.
nikolz, вот я и не пойму толком ничего. Винда 10. У винды с 10-ой версии вроде что-то там как-то поменялось. Толи на юникод на какой-то другой перешли, толи ещё что. Наверное был до этого юникод 2-х байтовый(наверное u16), а сейчас полный u8(8 - это не биты) - так наверное. У Вас какая винда, что проблем нет? Блин, локаль показывает ru-Ru, что пользователя, что системы, в вызове из DLL - локаль C. Ну вроде же сменил локаль, потом вывел, нет всё равно на нерусском пишет. Думаю поди надо ещё в этой локали кодировку(чарактер сет) сменить. Буду пробовать. Но это потом, пока это не критично, надо главные функции писать.
Какая кодировка используются в Lua?
 
За столько времени так никто и не ответил. Поддержка может хоть что-нибудь подсказать в решении проблемы? Мой вывод : в контексте толи потока QUIK, толь в Lua, локаль меняется с ru-Ru на локаль C, а в ней видимо русских букв вообще нету. Поэтому хоть что ты пиши, хоть кодируй текст - всё равно толку не будет, так как его попросту в чарактер сет(кодировке) нет как такового. Но почему не получается сначала  сохранить локаль C, потом установить родную локаль, вывести текст, потом локаь C вернуть обратно - не пойму.
Какая кодировка используются в Lua?
 
Попробовал .cpp файл открыть в проводнике виновс и сохранить его в ANSI, как сохраняю скрипты под Lua, но при загрузке в Visual Studio C++ студия отображает русские символы как положено, т.е. перекодирует под себя. Раньше как то пользовался таким способом только в других ситуациях и помогало - при загрузке отображались иероглифы, но например в консоль шло то что надо.
Какая кодировка используются в Lua?
 
Возникла проблема. Нас C написал библиотеку DLL. В ней функция для вызова из скрипта Lua. Библиотека подгружается, функция вызывается и нормально работает. Эта функция создаёт окна в отдельных потоках Windows, окна выводят cтроковую информацию API функциями Windоows(OutputDebugString, MessageBox), которые естественно корректно выводят русский текст при работе в простом приложении, но в DLL они выдают полную хрень из-за разных кодировок в среде Windows по умолчанию и в QUIK. Пробовал перед вызовом функций устанавливать локали по умолчанию через GetUserDefaultLocaleName и GetSystemDefaultLocaleName(обе возвращают "ru-Ru", а QUIK через _wsetlocale(LC_ALL, NULL) даёт локаль "C"), а потом вызывать функции вывода информации, после чего обратно возвращал локаль "C", чтобы QUIK работал не замечая временную смену локали. Не помогло!!! Как можно ещё выкрутиться? Изначально указать компилятору как-то(как?) закодить русский текст в кодировке QUIK-а? Писать строки через "\код" - не вариант, да и коды надо как-то генерить в кодировке QUIK-а. Пока что-то совсем на ум ничего не идёт.
Как работает OnCalculate(), Интерактивно указываю интервал расчета при помощи меток. Пересчитывается только текущая свеча
 
Цитата
nikolz написал:
Цитата
Alexander написал:
 
Цитата
Alexander  написал:
Я довольно много времени потратил на борьбу с этой идиотской динамической типизацией и не менее идиотским разделением на потоки.
 В lua, и в частности в скриптах для квика можно реализовать потоки? Если можно, то это как раз вариант разбивки алгоритма, чтобы каждый поток контролировал свой условный уровень.
Верно.
Например, у меня по колбеку onParam в функции main для каждого инструмента запускается отдельный скрипт в потоке который выбирается из пула свободных.
По умолчанию число потоков в пуле максимум 512.
-----------------
Кроме этого, тестил вариант когда в потоке запускается дочерняя VMLua  - подобно функции main.  Ее особенность в том что у нее общий глобальный стек с основным потоком QUIK.
Но число таких потоков ограничено размером стека VMLua основного потока.
О, здесь когда цитировал строки Владимира, видимо нажал Цитировать не в том месте и получилось, что я писал, а не Владимир, но по сути вопрос задан. А с потоками придётся позаниматься.

Цитата
nikolz написал:
для каждого инструмента запускается отдельный скрипт в потоке который выбирается из пула свободных.
Как запускается скрипт? чем? И как понять в потоке из пула? Тут как то можно использовать функции lua для запуска функций в отдельном потоке?(если таковые есть в lua, просто lua глубоко не изучал).
Как работает OnCalculate(), Интерактивно указываю интервал расчета при помощи меток. Пересчитывается только текущая свеча
 
Цитата
Alexander написал:
Я довольно много времени потратил на борьбу с этой идиотской динамической типизацией и не менее идиотским разделением на потоки.
В lua, и в частности в скриптах для квика можно реализовать потоки? Если можно, то это как раз вариант разбивки алгоритма, чтобы каждый поток контролировал свой условный уровень.
Как работает OnCalculate(), Интерактивно указываю интервал расчета при помощи меток. Пересчитывается только текущая свеча
 
Цитата
Владимир написал:
Alexander , Не может. Мой робот не может попасть в такую ситуацию. Он ничего не предполагает, он подаёт заявку на закрывающую сделку тогда, когда цена его устраивает. Он сам подстраивается под цену, а не цена под него. Ожидания могут уйти в бесконечность, но только в том случае, если курс стоит. А такого не бывает.
Ну а если курс сначала стоит, а потом пойдёт в противоположную сторону и довольно таки сильно, и будет там потом болтаться очень долго, месяцы например. Тогда что? На рынке же всякое может быть, и какой бы ни был робот, он идеальным быть не может. Для таких случаев я думаю использовать несколько уровней условных и если цена ушла не туда, то торговать алгоритм уже там, чем больше уровней можно себе позволить, тем конечно лучше, со временем глядишь и на старом уровне сделка закроется.
Страницы: Пред. 1 2 3 4 5 6 След.
Наверх