Решение: Как сделать, чтобы при выходе из индикатора Dll не выгружалась

 

Решил поделиться информацией по сабжу.

История такая: на диске есть набор файлов, которые читаются в память.

В памяти данные из файлов распределяются по времени начала дня и названию валюты.

Работа производится при помощи Dll.

.

Понятно, что при таком раскладе можно сделать маленькую оптимизацию,

а именно: чтобы при закрытии всех графиков Dll не выгружалась из памяти.

Потому что если в пустом терминале закрыть все и открыть новый график 

(или поменять что-то: таймфрейм / инструмент / параметры индикатора на единственном графике), <--- здесь не прав

то будет произведен Detach / Attach Dll'я и данные будут читаться заново, а их может быть немало.

.

Я решил это сделать так: 

- достать текущий поток threadId; по нему - идентификатор процесса procId

- по procId можно получить список всех модулей, которые относятся к процессу

- со все модулей получаем их полные пути и ищем там нашу Dll

- используем на полученном пути LoadLibrary()

.

Попутно удалось сделать открытие:

Если в коде Dll написать вызовы:

HANDLE thread = GetCurrentThread();
DWORD processId = GetProcessIdOfThread(thread);
то это будет ошибка 127 при загрузке Dll.

Да, вот так, очень весело! :-).

Если комментирую - все сразу запускается и работает.

Раскомментирую - появляется ошибка 127 при загрузке Dll.

Видимо, в секции импорта как-то прописываются адреса двух этих функций-

а метатрейдер почему-то их боится...

.

Поэтому идентификатор процесса я достаю по-другому.

/строим список процессов - ищем terminal.exe / достаем его модули / ищем нашу Dll/

В итоге все получилось! Индикатор выходит - а Dll не выгружается и данные потом не перечитываются!

.

Надеюсь, эта информация кому-нибудь пригодится!

 
После смены таймфрейма и тд - dll не выгрузится
 
Вместо того, что вы предложили, проще хранить данные которые вам нужно загрузить в бинарном виде, чтобы загрузка занимала доли секунды
 
antslag >>: После смены таймфрейма и тд - dll не выгрузится

Да. Смена инструмента/таймфрейма не приводит к выгрузке Dll. Написал умозрительно и не совсем верно.

antslag >>: Вместо того, что вы предложили, проще хранить данные которые вам нужно загрузить в бинарном виде, чтобы загрузка занимала доли секунды
Работы больше.