Bibliotecas: Mapeamento de Arquivo sem DLL - página 5

 
baramantan:

Não sou um mega programador. Mas não entendo onde está a universalidade? uchar não pode ser universal porque limita o usuário, a saber: uchar é apenas para valores positivos. O valor mínimo é zero, o valor máximo é 255.

Qualquer dado além do valor de uchar se torna igual ao valor máximo ou mínimo de uchar.

Com base no que eu disse, perguntei desde o início "como passar int ou double". Não estou entendendo, chefe.

OK, vamos fazer um pequeno tour.

1) Vejamos o exemplo de char e uchar. Ambas as variáveis têm 1 byte de tamanho.

Isso significa que, ao atribuirmos uma à outra, não perdemos bytes e, portanto, não perdemos o valor dos dados originais.

Veja estas expressões

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

O mesmo se aplica a long/ulong, int/uint.

Ou seja, variáveis do tipo inteiro com o mesmo tamanho em bytes podem ser passadas uma para a outra sem perder bytes de informação.

A propósito, isso significa que, embora o Expert Advisor aceite números MAGIC no tipo ulong, você sempre pode defini-los e lê-los em long, ou seja, no formato assinado, em seus programas


2. Agora, dê uma olhada em <some_type> e uchar.
Por exemplo, int. Como você sabe pelo sizeof(int), ele tem um tamanho de 4 bytes, o que significa que esses 4 bytes na memória podem ser facilmente representados como uma matriz uchar[4]
. Se houver um double ( 8 bytes), ele poderá ser representado como uma matriz uchar[8]
. Isso também se aplica a bytes de strings - em MQL, é uma matriz ushort.
bem e, consequentemente, se você tiver uma estrutura de qualquer tipo, poderá fornecer facilmente qualquer dado como uma matriz uchar.

São esses conceitos básicos sobre bytes que são usados na versão MQL5 - arquivos virtuais na memória CFastFile. Ele armazena quaisquer dados na memória da matriz uchar.

Ou seja, se você não precisar trocar dados com programas externos. Ou se você recebe dados de outro programa na forma de um fluxo de dados - por exemplo, lendo páginas da Internet, e esses dados não precisam ser salvos no disco, então é melhor usar o CFastFile em vez do mapeamento do Windows.

E, por fim, para consolidar totalmente o site https://www.mql5.com/pt/articles/364.

 
BoraBo:

O MT5 642 Win7 64 não funciona, pelo que entendi, depois de

hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // criar objeto de memória

Recebo o erro 1400,

mas o Vista 32 funciona.


isso se deve aos diferentes tamanhos de ponteiro nos sistemas 32 e 64

esse arquivo de biblioteca foi criado para um terminal de 32 bits.

Mas se você usar um terminal de 64 bits, deverá colocar o tipo longo de 8 bytes em todos os lugares em que um ponteiro estiver implícito (por exemplo, PBYTE, LPVOID, etc., e em todos os tipos de memcpy).

 

mas como faço para me conectar

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

Ele dá o fora

'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

e esses dois elementos funcionam um sem o outro.

 
olyakish:

mas como faço para me conectar

Ele dá

e essas duas inclusões funcionam uma sem a outra.

tente usar a resolução de contexto ::
 
sergeev:
tente usar a resolução de contexto ::

Obrigado

Eu só tive que modificar a biblioteca padrão.

//+------------------------------------------------------------------+
bool CSymbolInfo::CheckMarketWatch(void)
  {
//--- verificar se o símbolo está selecionado no 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);
        }
     }
//--- bem-sucedido
   return(true);
  }
//+------------------------------------------------------------------+
Não acho que isso seja uma coisa boa....
 
olyakish:

Obrigado a você.

Eu só tive que modificar a biblioteca padrão.

Não acho que isso seja uma coisa boa.

Você não está entendendo.

Eu lhe falei sobre kernel32::GetLastError e veja como ele está implementado em meu código.

Se você não estiver satisfeito com essa opção, declare import from kernel32 GetLastError, por exemplo, com o parâmetro int. Não haverá diferença ao chamá-lo, mas você evitará conflitos.

 
sergeev:

você não está entendendo.

Eu lhe falei sobre kernel32::GetLastError e veja como ele está implementado em meu código.

Se essa opção não for adequada para você, declare a importação de kernel32 GetLastError, por exemplo, com o parâmetro int. Não haverá diferença ao chamá-lo, mas você evitará conflitos.

Talvez eu não esteja explicando corretamente.

mas temos que

Porque aqui está um exemplo de seu código com a biblioteca padrão anexada.

//+------------------------------------------------------------------+
//|MemMap |
//| Direitos autorais © 2006-2013, FINEXWARE Technologies GmbH
//| www.FINEXWARE.com
//| programação e desenvolvimento - Alexey Sergeev, Boris Gershanov
//+------------------------------------------------------------------+
#property copyright "Direitos autorais © 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();
}

Ao compilar, ele apresenta os mesmos erros.

 

olyakish, leia novamente com atenção o que escrevi para você.

Se não estiver satisfeito com o contexto, estou lhe dizendo exatamente o que quero dizer.

  • "ou o que mudar em sua biblioteca".
 
sergeev:

você não está entendendo.

Eu lhe falei sobre kernel32::GetLastError e veja como ele está implementado em meu código.

Se essa opção não for adequada para você, declare a importação de kernel32 ::GetLastError, por exemplo, com o parâmetro int. Não haverá diferença ao chamá-lo, mas você evitará conflitos.

Ao chamar kernel32::GetLastError com seu contexto no código , o compilador chamará GetLastError sem contexto.

Os programadores só precisam estabelecer como regra chamar os análogos MQL das funções WinAPI padrão com contexto. Assim, não haverá problemas com modificações posteriores.

Assim, você corrige a bíblia padrão e ela é atualizada, sendo necessário editá-la novamente.

 
Urain:

Assim, você corrige a bíblia padrão e ela será atualizada, mas novamente você terá que editá-la.

O padrão é o padrão, portanto, não há nada a fazer, de jeito nenhum. Há um erro - informe aos desenvolvedores. Não há outra maneira.