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

 
o_O:
Escrevi que CMemMapFile::Open retorna um código de erro ou 0 quando não há erro.

No início da conversa, publiquei uma captura de tela do que a função CMemMapFile::Open retorna.

Era 0, como se não houvesse nenhum erro.


Depois, corrigi para ver se o identificador era NULL.

Print(__FILE__,", handle=",MapFile.m_hmem);

e, como resultado, obtive

2016.03.04 19:00:00.897 BuyNow Client v 1.03 USDCHF.m,M5: BuyNow Client v 1.03.mq4, handle=8589934592

Não há erro, há um identificador, o que mais você precisa, você pode dizer... mas ninguém criou a exibição do arquivo... E é impossível abrir um mapeamento que não tenha sido criado.

Ou talvez esse mapeamento tenha sido criado por outra pessoa e eu não saiba disso????

Algum programa cria uma tela com esse nome exato :-)

#define HADER "BuyNow v10"
CMemMapFile MapFile;
long handl;
int OnInit()
  {

//--- criar cronômetro
//---
      EventSetMillisecondTimer(Timer);
      handl=MapFile.Open(StringConcatenate("Local\\","_",HADER,"_",GetSymbol(),"_",((ServerAccauntNumber==0) ?  AccountNumber():ServerAccauntNumber)),BUF_SIZE+HEAD_MEM,modeOpen);
      Print(__FILE__,", handle=",MapFile.m_hmem);
//---
   return(INIT_SUCCEEDED);
  }
 

Dmitry Luck'janenko:


Ou talvez esse mapeamento tenha sido criado por outra pessoa e eu não saiba disso ???.

Algum programa cria um mapeamento com esse nome exato :-)


Bem, você mesmo criou algo antes disso)

O software trabalha com a memória dessa forma. Ele não limpa nada de uma vez. É por isso que os dados antigos podem permanecer e ser abertos.

Mas, quando sobrescrevem, não abrem. Você provavelmente não fez nada entre as aberturas.
 

Excelente biblioteca, utilizei-a junto com mutexes para escrever uma copiadora local

Como um componente importante para o receptor, obtive o tamanho do arquivo e criei um loop a partir dele,

Encontrei alguns erros - ArrayOutOfRange ou falta de 4 bytes.

Corrigido

//------------------------------------------------------------------ Write
int CMemMapApi::Write(HANDLE64 hmem, const uchar &buf[], DWORD pos, int sz, DWORD &err) // gravar o número especificado de bytes na memória
{
        if (hmem==NULL) return(-1);
        PBYTE64 view=ViewFile(hmem, err); if (view==0 || err!=0) return(-1); // se não estiver aberto
        DWORD size=GetSize(hmem, err); if (pos+sz>size) { UnViewFile(view); return(-2); }; // se o tamanho for menor, sair
        uchar src[]; 
        ArrayResize(src, size+HEAD_MEM); 
        memcpyX(src, view, size+HEAD_MEM); // pegou o bytebuffer
        for(int i=0; i<sz; i++)
        { 
        src[pos+i+HEAD_MEM]=buf[i]; // gravado na memória
        }
        memcpyX(view, src, size+HEAD_MEM); // copiou-o de volta
        UnViewFile(view); // fechou a visualização
        return(0); // retornou OK.
}
//------------------------------------------------------------------ Read
int CMemMapApi::Read(HANDLE64 hmem, uchar &buf[], DWORD pos, int sz, DWORD &err) // ler da memória o número especificado de bytes
{
        if (hmem==NULL) return(-1);
        PBYTE64 view=ViewFile(hmem, err); if (view==0 || err!=0) return(-1); // se não estiver aberto
        DWORD size=GetSize(hmem, err); // obteve o tamanho
        uchar src[]; 
        ArrayResize(src, size+HEAD_MEM);
        memcpyX(src, view, size+HEAD_MEM); // pegou o bytebuffer
        ArrayResize(buf, sz);
        int i=0; 
        for(i=0; i<sz && pos+i<size; i++) 
        {
        buf[i]=src[pos+i+HEAD_MEM]; // ler bytes
        //i++;
        }
        UnViewFile(view); // fechou a visualização 
        return(i); // número de bytes copiados
}
 

Se eu criar um MMF por meio da MQL5, gravo nele e depois o leio.

Mas se eu criar um MMF com outro programa, quando tento gravar ou ler a partir dele, ocorre um erro crítico.

Qual é o problema?

 
Alex19791979:

Se eu criar um MMF por meio da MQL5, gravo nele e depois o leio.

Mas se eu criar um MMF com outro programa, quando tento gravar ou ler a partir dele, ocorre um erro crítico.

Qual é o problema?


O clube de telepatas está se esforçando para adivinhar o número do erro crítico.

 
Alexey Volchanskiy:

O clube de telepatas está tentando adivinhar o número do erro crítico.

topikstarter está bloqueado contra a influência telepática
 

Mensagem de erro crítico do MT5 sem código de erro. Se houvesse um código, ele seria indicado.

 
Alex19791979:

Mas se eu criar o MMF com outro programa, quando tento gravar ou ler a partir dele, ocorre um erro crítico.

Qual é o problema?

- verifique se não há erros ao abrir o arquivo
- verifique o volume alocado disponível para leitura/gravação em todas as funções de trabalho com matrizes/cadeias de caracteres (leve em conta 2 bytes)
etc.

 

Problema resolvido.

É necessário gravar e ler arquivos MMF por um aplicativo de terceiros a partir de 4 bytes, não de 0.

E para o MT5, 4 bytes não são contados, mesmo que o deslocamento seja 0.

Por isso, quando um programa de terceiros escrevia a partir de 0 byte, ocorria um erro ao tentar ler o MT5.

 
Alex19791979:

Problema resolvido.

É necessário gravar e ler arquivos MMF por um aplicativo de terceiros a partir de 4 bytes, não de 0.

E para o MT5, 4 bytes não são contados, mesmo que o deslocamento seja 0.

Por isso, quando eu tinha um programa de terceiros gravando a partir de 0 byte, ao tentar ler o MT5, ocorria um erro.

Talvez você não tenha levado em conta que os primeiros bytes da classe são alocados para o cabeçalho, onde o tamanho do arquivo é armazenado?