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

 
baramantan:

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

Любые данные выходящие за пределы значения uchar становятся равными максимальным или минимальным значениям uchar.

Исходя из сказанного я и спросил с самого начала "как передовать int или double".  Я не улавливаю вашу мысль шеф.

ок. давайте небольшой экскурс.

1. рассмотрим пример char и uchar. обе переменные являются размером 1 байт

это значит что присваивая друг другу мы не теряем байты и  значит, не теряем значения исходных данных.

посмотрите на такие выражения

uchar u=200; char c=u; u=c; Print(u);
c=-100; u=c; c=u; Print(c);

Аналогичное относится и к long/ulong,   int/uint

То есть переменные целого типа одного размера в байтах можно передавать друг другу без потери байт информации.

Это кстати значит то, что хоть эксперт и принимает MAGIC номера в ulong типе, но вы в своих программах всегда можете его задавать и читать в long, то есть знаковом формате


2. теперь смотрим на <какой_то_тип> и uchar.
Например int. Как вы знаете из sizeof(int) он имеет размер 4 байта.  Это значит, что эти 4 байта в памяти можно запросто представить в виде uchar[4] массива
если будет double (это 8 байт), то его можно представить в виде массива uchar[8]
Это относится и к байтам строк - в MQL это массив ushort.
ну и соответственно если вы имеете структуру любого типа, то вы запросто можете любые данные предоставить в виде uchar массива.

Именно эти базовые понятия про байты и используются в MQL5 версии - виртуальные файлы в памяти CFastFile. В нем сохраняются любые данные в память uchar массива.

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

ну и напоследок для полного закрепления https://www.mql5.com/ru/articles/364

 
BoraBo:

MT5 642  Win7 64  не работает, насколько я понял то после 

hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // создаем объект памяти

получается ошибка 1400,

а Vista 32 работает.

 


это из-за разного размера указателей в 32 и 64 системах

данный файл библиотеки сделан для 32 итного терминала.

но если вы используете 64 битный терминал, то нужно во всех местах, где подразумевается указатель (например тип PBYTE, LPVOID и т.д., и во всех memcpy)  поставить 8-байтовый тип long.


 

а как подружить

#include <MemMapLib.mqh>
#include <Trade\Trade.mqh> 

выдает

'GetLastError' - ambiguous call to overloaded function with the same parameters SymbolInfo.mqh  718     10
'GetLastError' - ambiguous call to overloaded function with the same parameters	SymbolInfo.mqh	725	57

а эти два инклюда друг без друга работают.

 
olyakish:

а как подружить

выдает

а эти два инклюда друг без друга работают.

попробовать воспользоваться разрешением контекста ::
 
sergeev:
попробовать воспользоваться разрешением контекста ::

Спасибо

только пришлось изменять стандартную библиотеку

//+------------------------------------------------------------------+
bool CSymbolInfo::CheckMarketWatch(void)
  {
//--- check if symbol is selected in the MarketWatch
   if(!Select())
     {
      if(::GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL)
        {
         printf(__FUNCTION__+": Unknown symbol '%s'",m_name);
         return(false);
        }
      if(!Select(true))
        {
         printf(__FUNCTION__+": Error adding symbol %d",::GetLastError());
         return(false);
        }
     }
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
что то мне кажется это не есть хорошо...
 
olyakish:

Спасибо

только пришлось изменять стандартную библиотеку

что то мне кажется это не есть хорошо...

вы не поняли.

я вам сказал про kernel32::GetLastError.  Посмотрите как реализовано в моем коде.

если такой вариант  не устраивает, то объявите импорт из kernel32  GetLastError например с int параметром.  разницы при вызове не будет, но от конфликта уйдете.

 
sergeev:

вы не поняли.

я вам сказал про kernel32::GetLastError.  Посмотрите как реализовано в моем коде.

если такой вариант  не устраивает, то объявите импорт из kernel32  GetLastError например с int параметром.  разницы при вызове не будет, но от конфликта уйдете.

Возможно я не верно излагаю.

но приходится

так как вот пример вашего кода с подключенной стандартной библиотекой

//+------------------------------------------------------------------+
//|                                                           MemMap |
//|               Copyright © 2006-2013, FINEXWARE Technologies GmbH |
//|                                                www.FINEXWARE.com |
//|      programming & development - Alexey Sergeev, Boris Gershanov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006-2013, FINEXWARE Technologies GmbH"
#property link      "www.FINEXWARE.com"
#property version   "1.00"
#include <MemMapLib.mqh>
#include <Trade\Trade.mqh> 


//------------------------------------------------------------------    OnStart
void OnStart()
{
        CMemMapFile hmem;
        long err=hmem.Open("Local\\test",111,modeCreate);
        
        uchar data[];
        StringToCharArray("Hello from MQL5!",data);
        err=hmem.Write(data,ArraySize(data));
        
        ArrayInitialize(data,0);
        hmem.Seek(0,SEEK_SET);
        err=hmem.Read(data,ArraySize(data));
        Print(CharArrayToString(data));
        
        hmem.Close();
}

при компиляции выдает те же ошибки.

 

olyakish, прочитайте еще раз внимательно что я вам написал.

если вас не устраивает контекст, то я вам говорю именно про

  • "или что менять вашей библиотеке"
 
sergeev:

вы не поняли.

я вам сказал про kernel32::GetLastError.  Посмотрите как реализовано в моем коде.

если такой вариант  не устраивает, то объявите импорт из kernel32  GetLastError например с int параметром.  разницы при вызове не будет, но от конфликта уйдете.

При вызове в коде kernel32::GetLastError со своим контекстом, компилятор бажит вызов GetLastError без контекста.

Просто программистам нужно взять за правило MQL-аналоги стандартных функций WinAPI вызывать с контекстом. Тогда и проблем с последующей допилкой не будет.

А так исправишь стандартную библу а она возьми да обновись, опять лезь правь.

 
Urain:

А так исправишь стандартную библу а она возьми да обновись, опять лезь правь.

Стандартная на то и стандартная, что нечего туда лезть, ни в коем случае. Есть ошибка -- репорт разработчикам. Никак иначе.