Библиотеки: Memory Mapping

 

Memory Mapping:

DLL (проект VC++ 2010) для работы с Memory Mapping.

Функции DLL позволяют:

  • Cоздавать файл в памяти;
  • Записывать и читать из него данные;
  • Возможность обмениваться данными между приложениями. В том числе между МetaТrader 4 и МetaТrader 5.

Примеры использования DLL в МetaТrader 5 - Мониторинг котировок (пример для маппинга)

Автор: Alex Sergeev

 

Может кому пригодится:

Как альтернатива можно сделать RAM диск и размещать там файлы. Ram диск это виртуальных диск, расположенный в оперативной памяти компьютера.

Я использую такое ПО для создания Ram-диска http://ramdisk.nm.ru/ramdiskent-rus.htm 

 

Вот бы это всё в MQL зашить, чтоб без dll можно было юзать.

Спасибо Alex, классная штука.

 
Urain:

Вот бы это всё в MQL зашить, чтоб без dll можно было юзать.

к сожалению вся проблема в одной единственной функции - MapViewOfFile.  она возвращает указатель.  Поэтому в MQL напрямую её не поиспользуешь...  указатель к массиву не приведешь.

Все остальные функции (их всего 4 -CreateFileMapping,  OpenFileMapping, UnmapViewOfFile, CloseHandle)  вызывать можно. 
но вот только эта MapViewOfFile не дала возможности создать полнофункциональную работу из MQL с маппингом напрямую. а жаль, сам тоже очень хотел без самописной DLL сделать.

 
sergeev:

к сожалению вся проблема в одной единственной функции - MapViewOfFile.  она возвращает указатель.  Поэтому в MQL напрямую её не поиспользуешь...  указатель к массиву не приведешь.

Все остальные функции (их всего 4 -CreateFileMapping,  OpenFileMapping, UnmapViewOfFile, CloseHandle)  вызывать можно. 
но вот только эта MapViewOfFile не дала возможности создать полнофункциональную работу из MQL с маппингом напрямую. а жаль, сам тоже очень хотел без самописной DLL сделать.

Да собственно это камень не в тебя, посыл был разработчикам MQ, проблема давняя и её решение явно востребовано.

ЗЫ Я для похожих целей (но внутри одного МТ) писал функции передачи указателей на массив через событие, но без dll тоже не получилось, хотя функции в dll были одно строчные.

 
Urain:

Да собственно это камень не в тебя, посыл был разработчикам MQ, проблема давняя и её решение явно востребовано.

о да, что надо, то надо.

а ты вообще делал как нибудь, чтоб создать функцию преобразователь

например какая-то dll функция возвращает указатель, то есть имеем int(4). В большинстве случаев это будет указатель на некоторую структуру. 

И дальнейшая задача - вытянуть данные из этой структуры. Размер структуры нам известен, значит этот указатель можно будет сначала перевести на указатель на char массив.

вот вопрос - как такое переприсвоение сделать?  как обмануть ?  может через промежуточную dll функцию, в которую передавать указатель, а она будет возвращать этот самый char массив ?
Ну а далее этот char массив простым = переводим в нашу структуру.

вот как вариант такая функция в dll

void Convert(char *_in, char *_out) { _out=_in; }

и она вызывается из mql так

// например функция из апи вернула указатель на структуру данных
int ptr=ФункцияИзАпи(); // указатель на ДанныеИзАпи

struct ДанныеИзАпи
{
  // структура данных из апи размером 16 байт
};

struct refData
{
 char byte[16]; // образ этой же структуры, тоже = 16 байтам 
};

refData ref;

Convert(ptr, ref.byte); // перевели указатель на массив

ДанныеИзАпи data=ref; // заполнили поля структуры простым копированием

PS
Хотя пришла идея с memcpy.  Она ведь тоже копирует по указателю.  надо попробовать сейчас.


 
да. memcpy работает! а в связке с strcpy можно обрабатывать даже строки корректно,

так что может все получится и напрямую!!! 
 

Еще один камень в огород МК.

К чему такие заморочки?

Неужели  свои же программы могут испортить фейс?

 

 
Urain:

Да собственно это камень не в тебя, посыл был разработчикам MQ, проблема давняя и её решение явно востребовано.

вобщем все гуд, проблему эту решил, библа для MQL5 без использования самописной DLL успешно сделана и проверена.

на публикацию уже отправил :)

 
her.human:

Еще один камень в огород МК.

К чему такие заморочки?

Неужели  свои же программы могут испортить фейс?

Программы MQ5/EX5 очень легко распространяются и без жесткого контроля за безопасностью могут нанести пользователям непоправимый ущерб.

Именно поэтому прикладной язык MQL5 создан защищенным, без возможности вызывать опасные функции и работающим в собственной песочнице. Для расширения функционала есть интеграция с DLL библиотеками.

 
Renat:

Программы MQ5/EX5 очень легко распространяются и без жесткого контроля за безопасностью могут нанести пользователям непоправимый ущерб.

Именно поэтому прикладной язык MQL5 создан защищенным, без возможности вызывать опасные функции и работающим в собственной песочнице. Для расширения функционала есть интеграция с DLL библиотеками.

А как жешь Маркет?

или в марткете win dll будут разрешены?

в общем я знаю ответ, поэтому и предложил сделать данную реализацию в стандарте MQL5.