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

 
Urain:
Acho que temos que fazer algum tipo de teste garantido. Mas ainda não sei como.

Em termos lógicos, o fechamento de um identificador faz com que a área de memória seja liberada.

Mas isso não significa que fechar o identificador deva zerar essa área. O identificador é fechado, os dados gravados permanecem até serem substituídos por outro software.

 
sergeev:
Se você usar arquivos para armazenar dados intermediários, é claro que pode fazê-lo. O principal é redefinir os dados para o disco em alguns pontos de referência, pois se algo acontecer, as informações serão irremediavelmente perdidas.
Se "algo acontecer", as informações reais serão perdidas em qualquer caso. E os resultados intermediários, sim, podem ser despejados periodicamente em um arquivo na ferrovia.
 
sergeev:

Em termos lógicos, fechar a alça liberará essa área de memória.

Mas isso não significa que o fechamento do manipulador deva zerar essa área. Com o manipulador fechado, os dados gravados permanecem até serem substituídos por outro software.

O arquivo é fechado, a alça é destruída, abrimos um arquivo com o mesmo nome e lemos as informações necessárias, embora a área distribuída deva ser perdida e abrir um arquivo destruído sem criá-lo deva causar um erro. Não sei se isso é um bug ou um recurso.

#include <MemMapLib.mqh>
//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
   CMemMapFile *hmem=new CMemMapFile();
   int err=hmem.Open("Local\\test",111,modeCreate);// criar um arquivo

   uchar data[];
   int sizedata=StringToCharArray("Hello from MQL5!",data);
   err=hmem.Write(data,sizedata);  // escrever
   ArrayInitialize(data,0);

   CMemMapFile hm;
   err=hm.Open("Local\\test",111); // abrir o arquivo, sem criar
   uchar nextdata[];
   hm.Seek(0,SEEK_SET);
   err=hm.Read(nextdata,sizedata); // ler
   Print(CharArrayToString(nextdata));

   ArrayInitialize(data,0);
   err=hmem.Open("Local\\test",111); // abrir o arquivo, sem criar
   hmem.Seek(0,SEEK_SET);
   err=hmem.Read(data,sizedata);     // ler
   Print("para",CharArrayToString(data));

   hmem.Close(); delete hmem; // fechar o arquivo
   hm.Close();                // fechar o arquivo

   ArrayInitialize(data,0);
   err=hm.Open("Local\\test",111);Print("err=",err);
   hm.Seek(0,SEEK_SET);
   err=hm.Read(data,sizedata);
   Print("depois",CharArrayToString(data));
  }
//+------------------------------------------------------------------+
 
Urain:

embora a área distribuída deva ser perdida e abrir um arquivo destruído sem criá-lo deva causar um erro.

Acho que isso é um bug.

O truque é que há um nome de arquivo na memória. E o sistema o detecta.

 

Pessoal, tenho uma solicitação.

Preciso encontrar uma função de API - de qualquer API, incluindo as que não são do Windows - que não permita o uso de memcpy/strcpy .

Ou seja, encontrar um caso em que, por algum motivo, o tamanho do ponteiro retornado não seja conhecido ou a string retornada não tenha terminação NULL e não tenha tamanho conhecido.


Por favor, me ajude a encontrar os limites da aplicação desse método...

 

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.

 

Eu verifiquei e obtive o mesmo erro. Mas =6.

 
sergeev:

Eu verifiquei e obtive o mesmo erro. Mas =6.



Deve ser algum tipo de truque. Na inicialização direta, ele apresenta err=6, mas no modo de depuração, err=1400.

 
Como transferir matrizes int ou double? Não consigo fazer isso :(
 
baramantan:
Como transferir matrizes int ou double? Não consigo fazer isso :(
Trate-os como variáveis longas de sizeof(<Type>)*<Number_Elements> e tudo funcionará :)