Сохранение состояние между вызовами функций из DLL - страница 2

 
Buhach:


По синтаксису ясно видно, что это в dll.

Какое значение имеет DllMain? Это вообще необязательная опциональная функция.

Можно в проекте ее указывать или не указывать, это ничего не меняет.

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

Не про синтаксис спрашивал. Про вызов.

Кому DllMain необязательная, кому обязательная. Там разные фокусы можно делать с библиотекой. Не представляю, как без неё работать. Было бы очень трудно.

Buhach:
Проблема оказалась банальна и по моей вине. Дело ведь в том, что все, что после return уже не выполняется в c++. Поэтому и сброс значения не происходил. Поставил выше ретерна и все заработало. Значения сохраняются между вызовами. Все просто...

Между последовательными потоками это работать не будет. Поток завершится и библиотека выгрузится вместе со всеми данными.

Например, хотите проверить работу функции в незацикленном скрипте. Скрипт завешился, поток завершился. Данных больше нет. Со следующего запуска всё по новой. С экспертом полегче. С индикатором ещё лучше. Но разумнее делать невыгружаемые DLL. Это, как раз, в DllMain() можно организовать.

Ну, да. Код там неправильный.

 
Buhach:
Это замечательно, но мне надо прямо сейчас
Прямо сейчас тоже можно. Добровольно. А скоро будет принудиловка.
 
Buhach:

Единственное, что точно будет работать и до чего я додумался, это передача на mql сторону строкового массива с инфой.



Зачем строковый массив, передавайте int[] или double[] по ссылке через параметр. Я так качаю данные между mql и dll мегабайтами... и никакого парсинга не надо.
 
Zhunko:

Не про синтаксис спрашивал. Про вызов.

Кому DllMain необязательная, кому обязательная. Там разные фокусы можно делать с библиотекой. Не представляю, как без неё работать. Было бы очень трудно.

Между последовательными потоками это работать не будет. Поток завершится и библиотека выгрузится вместе со всеми данными.

Например, хотите проверить работу функции в незацикленном скрипте. Скрипт завешился, поток завершился. Данных больше нет. Со следующего запуска всё по новой. С экспертом полегче. С индикатором ещё лучше. Но разумнее делать невыгружаемые DLL. Это, как раз, в DllMain() можно организовать.

Ну, да. Код там неправильный.


А, вы про это... Тогда прошу прощения.

Вызов из эксперта. А есть разница в вызове dll-функций в скриптах, индикаторах и экспертах?

В данный момент DllMain () у меня вообще нет. В стандартном примере она есть, но я не представляю зачем она нужна. Ведь и без нее работает.

Про невыгружаемые DLL в гугле ничего не нашел.

А вообще, заметил еще более странную вещь. Значения в dll сохраняются ДАЖЕ ПРИ ПЕРЕЗАПУСКЕ эксперта. То есть мы установили какое-то значение в dll, удалили с графика эксперт, потом вновь добавили - и значение будет таким, каким осталось в прошлый раз. Это уже совсем странное поведение. Приходится очищать ресурсы каждый раз и все контролировать. Это нормально? Так и должно быть?

Ибо тогда dll работает так, будто мы и не вырубали эксперт, будто программа в dll все еще выполняется.

Было бы идеально, если бы эксперт загружал DLL, проделывал с ней все что угодно, а потом выгружал, чтобы при следующем запуске эксперта программа в DLL запустилась вновь с чистыми данными, как в первый раз.

 
alsu:

Зачем строковый массив, передавайте int[] или double[] по ссылке через параметр. Я так качаю данные между mql и dll мегабайтами... и никакого парсинга не надо.


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

Формат разный, на разные команды нужны разные данные.

 
Buhach:


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

Формат разный, на разные команды нужны разные данные.


Мне как-то приходилось работать из MQL в условиях неопределенности типа и количества возвращаемых данных.

Смысл в двухшаговой процедуре: функции "дать задачу DLL" и "получить данные из DLL" должны быть разделены. Т.е. на первая процедура возвращает в MQL тип и количество полученных данных, сами данные при этом остаются в Dll, потом в MQL выделяется необходимая память под данные и уже затем вызывается нужная функция исходя из типа.

По такой схеме, кстати, работают движки баз данных, например, при выполнении команды SELECT.

 
Buhach:


А, вы про это... Тогда прошу прощения.

1. Вызов из эксперта. А есть разница в вызове dll-функций в скриптах, индикаторах и экспертах?

2. В данный момент DllMain () у меня вообще нет. В стандартном примере она есть, но я не представляю зачем она нужна. Ведь и без нее работает.

3. Про невыгружаемые DLL в гугле ничего не нашел.

4. А вообще, заметил еще более странную вещь. Значения в dll сохраняются ДАЖЕ ПРИ ПЕРЕЗАПУСКЕ эксперта. То есть мы установили какое-то значение в dll, удалили с графика эксперт, потом вновь добавили - и значение будет таким, каким осталось в прошлый раз. Это уже совсем странное поведение. Приходится очищать ресурсы каждый раз и все контролировать. Это нормально? Так и должно быть?

Ибо тогда dll работает так, будто мы и не вырубали эксперт, будто программа в dll все еще выполняется.

1. Выше написал про это. Дело в завершении потока, где работает библиотека.

2. Можно без DllMain(), если ничего интересного от библиотки не надо.

3. Ищите про счётчик пользователей.

4. Это интересно! Раньше, давно, DLL не выгружались. Терминал держал пока сам не выгрузится. Потом они стали выгружаться. Получается сейчас опять они невыгружаемые. Я даже не заметил этого. Они у меня всегда невыгружаемые.

Если в DLL создать зацикленный поток и оставить его после завершения потока, вызвавшего DLL, то, возможно, сейчас это не даст выгрузить DLL. Помню, раньше это приводило к аварийному завершению терминала. Сейчас не знаю.

 

Пример того, что я имею в виду

#import "mydll.dll"
   void GetFieldCount(int &count); //вернет количество полей данных
   void GetFieldDescription(int &types[], int &sizes[]); //вернет описание полей
   void GetDataInt(int field_no, int &data[]); // а дальше выбираем то, что нужно
   void GetDataDouble(int field_no, double &data[]);
   void GetDataString(int field_no, string &data[]);

 

Buhach:

А вообще, заметил еще более странную вещь. Значения в dll сохраняются ДАЖЕ ПРИ ПЕРЕЗАПУСКЕ эксперта. То есть мы установили какое-то значение в dll, удалили с графика эксперт, потом вновь добавили - и значение будет таким, каким осталось в прошлый раз. Это уже совсем странное поведение. Приходится очищать ресурсы каждый раз и все контролировать. Это нормально? Так и должно быть?

Ибо тогда dll работает так, будто мы и не вырубали эксперт, будто программа в dll все еще выполняется.

Было бы идеально, если бы эксперт загружал DLL, проделывал с ней все что угодно, а потом выгружал, чтобы при следующем запуске эксперта программа в DLL запустилась вновь с чистыми данными, как в первый раз.

Zhunko:

4. Это интересно! Раньше, давно, DLL не выгружались. Терминал держал пока сам не выгрузится. Потом они стали выгружаться. Получается сейчас опять они невыгружаемые. Я даже не заметил этого. Они у меня всегда невыгружаемые.

Проверил. Всё по-старому. Выгружается библиотека между вызовами.

Причина обращения: