Библиотеки: File Mapping без DLL - страница 7

 
o_O:

в либе не сделано привязки к секциям, так как теоретически код может выполнятся в разных процессах.

Для контроля юзайте или ваш вариант или например https://www.mql5.com/ru/code/1835

Я правильно понял, что если мютекс именованный, то я могу получить его хэндл из любого процесса, а не только из метатрейдера?
 
Al_key:
Я правильно понял, что если мютекс именованный, то я могу получить его хэндл из любого процесса, а не только из метатрейдера?
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686931%28v=vs.85%29.aspx сам нашел ответ. Действительно, их можно делить между процессами.
 

Вопрос автору.

Использую класс в мт4. Если выключить и включить терминал то все перестает работать. Выход не очень удобный удалить советники перед выключением и прикрепить после включения терминала. Можно ли как нибудь обойти эту проблему.

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

Вкратце, это торговые панели работающие на множество терминалов.

 
Dmitry Luck'janenko:


Если выключить и включить терминал то все перестает работать. Выход не очень удобный удалить советники перед выключением и прикрепить после включения терминала. Можно ли как нибудь обойти эту проблему.

надо логировать и посмотреть что происходит с файлами при такой деинициализации. нет ли каких то локов.

Не получается считать файловое отображение

какая функция из винапи подразумевается под "считать"?

 
o_O:

надо логировать и посмотреть что происходит с файлами при такой деинициализации. нет ли каких то локов.

какая функция из винапи подразумевается под "считать"?

Дело в том что функция

HANDLE64 CMemMapFile::Open(LPTSTR path, DWORD size, int mode=modeOpen)

всегда возвращает значение 0.


Поэтому я не могу толком понять открыт ли файл.

На картинке выше лог открытия эксперта который открывает не созданное еще файловое отображение. И никаких ошибок.

Может быть функцию

CMemMapFile::Open

вставлять не в int OnInit(), а дальше где нибудь например в OnTick() но так как возвращаемый хэндл всегда 0 то нет возможности сделать проверку чтобы не открывать файл постоянно с каждым тиком.

И по второму вопросу.

В делфи создается приложение которое создает файловое отображение. При подключении возникают ошибки. А именно Не правильно переданные числа. Начал ровнять с помощью {$Align Off}

пошли другие ошибки типа Access violation read to 0x04E91000 in 'msvcrt.dll' .

Сейчас данные выровнял нормально по 19 байт - "00:35:50.260    Панель v 1.00 GBPUSD.m,M5: OnInitsizeof(PipeData)= 19"


но при чтении все данные по нулям.

 
Dmitry Luck'janenko:

Дело в том что функция

всегда возвращает значение 0.

Поэтому я не могу толком понять открыт ли файл.

все верно, CMemMapFile::Open возвращает код ошибки или 0 когда ошибки нет.

(в отличии от CMemMapApi:, которая вернет открытый хендл, а ошибку запишет в переданный параметр)

А хендл лежит в m_hmem



В делфи создается приложение которое создает файловое отображение. При подключении возникают ошибки. А именно Не правильно переданные числа.

учитываете ли вы зарезервированные DWORD байт в начале файла ?
 
o_O:


учитываете ли вы зарезервированные DWORD байт в начале файла ?
4 байта? попробую, не учитывал
 
Dmitry Luck'janenko:
4 байта? попробую, не учитывал

посмотрите как происходит запись или создание файла в исходнике.

на параметр m_size

 
o_O:

все верно, CMemMapFile::Open возвращает код ошибки или 0 когда ошибки нет.

(в отличии от CMemMapApi:, которая вернет открытый хендл, а ошибку запишет в переданный параметр)

А хендл лежит в m_hmem


учитываете ли вы зарезервированные DWORD байт в начале файла ?
2016.03.04 19:00:00.897    BuyNow Client v 1.03 USDCHF.m,M5: BuyNow Client v 1.03.mq4, handle=8589934592


это m_hmem при открытии несуществующего файлового отображения. Как определить это ошибка или хэндл?

 
Dmitry Luck'janenko:

это m_hmem при открытии несуществующего файлового отображения. Как определить это ошибка или хэндл?

я ж написал, что CMemMapFile::Open возвращает код ошибки или 0 когда ошибки нет
Причина обращения: