Bibliotecas: Mapeamento de Memória

 

Mapeamento de Memória:

Este projeto(Visual C++ 2010) contém 2 classes - CMemMapApi e CMemMapFile.

São projetados para trabalhar com arquivos de mapeamento de memória. Você pode:

  • Criar arquivo em memória;
  • Escrever e ler dados a partir do arquivo de mapeamento de memória;
  • Ele fornece uma oportunidade para a troca de dados entre aplicativos, incluindo MetaTrader 4 e МetaТrader 5.
Usando arquivos de mapeamento de memória você pode conseguir um grande desempenho na troca de dados.

A aplicação principal é a troca de dados:
  • Cópia dos negócios para vários terminais em PC único.
  • Cotações de troca de dados para Expert Advisors de arbitragem etc.

Autor: o_O

 

Pode ser útil para alguém:

Como alternativa, você pode criar um disco RAM e colocar os arquivos nele. O disco RAM é um disco virtual localizado na RAM de seu computador.

Eu uso esse software para criar um disco RAM http://ramdisk.nm.ru/ramdiskent-rus.htm

 

Gostaria que tudo isso pudesse ser escrito em MQL, para que pudesse ser usado sem a dll.

Obrigado, Alex, muito legal.

 
Urain:

Seria bom se tudo isso pudesse ser implementado no MQL para que pudesse ser usado sem a dll.

Infelizmente, todo o problema está em uma única função - MapViewOfFile. Ela retorna um ponteiro, portanto, não é possível usá-la diretamente em MQL... não é possível trazer um ponteiro para uma matriz.

Todas as outras funções (há apenas 4 delas -CreateFileMapping, OpenFileMapping, UnmapViewOfFile, CloseHandle) podem ser chamadas.
mas apenas esse MapViewOfFile não deu a oportunidade de criar um trabalho totalmente funcional a partir do MQL com mapeamento direto. e é uma pena, eu também queria muito fazer isso sem uma DLL escrita por mim mesmo.

 
sergeev:

Infelizmente, todo o problema está em uma única função - MapViewOfFile. Ela retorna um ponteiro, portanto, não é possível usá-la diretamente no MQL... não é possível trazer um ponteiro para uma matriz.

Todas as outras funções (existem apenas 4 delas -CreateFileMapping, OpenFileMapping, UnmapViewOfFile, CloseHandle) podem ser chamadas.
mas apenas esse MapViewOfFile não deu a oportunidade de criar um trabalho totalmente funcional a partir da MQL com mapeamento direto. e é uma pena, eu mesmo também queria muito passar sem uma DLL escrita por mim.

Na verdade, não se trata de você, a mensagem era para os desenvolvedores de MQ, o problema é antigo e sua solução está obviamente em demanda.

ZY: Escrevi funções de passagem de ponteiros para a matriz via evento para fins semelhantes (mas dentro de um MT), mas também não funcionou sem a dll, embora as funções na dll fossem de linha única.

 
Urain:

Na verdade, não é você, a mensagem era para os desenvolvedores de MQ, o problema é antigo e sua solução está obviamente em demanda.

Ah, sim, o que é necessário é necessário.

Você já fez alguma coisa para criar uma função de conversão?

Por exemplo, alguma função da dll retorna um ponteiro, então temos int(4). Na maioria dos casos, será um ponteiro para alguma estrutura.

E a próxima tarefa é extrair dados dessa estrutura. Como sabemos o tamanho da estrutura, podemos primeiro traduzir esse ponteiro para um ponteiro de uma matriz de caracteres.

Eis uma pergunta: como fazer essa reatribuição? Como trapacear? Talvez por meio de uma função dll intermediária, na qual passaremos o ponteiro e ele retornará essa matriz de caracteres?
Bem, e então essa matriz de caracteres por simples = transferência para nossa estrutura.

Aqui está uma variante dessa função na dll

void Convert(char *_in, char *_out) { _out=_in; }

e ela é chamada a partir do mql desta forma

// por exemplo, a função api retornou um ponteiro para uma estrutura de dados
int ptr=ФункцияИзАпи(); // ponteiro para ДанныеИзАпи

struct ДанныеИзАпи
{
  // estrutura de dados da API 16 bytes
};

struct refData
{
 char byte[16]; // imagem da mesma estrutura, também = 16 bytes 
};

refData ref;

Convert(ptr, ref.byte); // traduziu o ponteiro para a matriz

ДанныеИзАпи data=ref; // preencher os campos da estrutura por meio de cópia simples

PS
Embora eu tenha tido uma ideia com o memcpy, ele também copia por ponteiro. Devo tentar agora.
 
sim. memcpy funciona ! e, em conjunto com strcpy , é possível processar até mesmo cadeias de caracteres corretamente,

para que possa funcionar diretamente!!!!
 

Mais uma pedra a favor do MK.

Por que tanta confusão?

Será que seus próprios programas podem realmente estragar a cara?

 
Urain:

Na verdade, isso não é uma pedra contra você, a mensagem era para os desenvolvedores de MQ, o problema é antigo e sua solução é obviamente procurada.

Em suma, tudo está bem, o problema foi resolvido, a bíblia para MQL5 sem o uso de uma DLL auto-escrita foi criada e testada com sucesso.

Eu já a enviei para publicação :)

 
her.human:

Mais uma pedra a favor do MK.

Por que tanta confusão?

Seus próprios programas podem realmente estragar o visual?

Os programas MQ5/EX5 são distribuídos com muita facilidade e, sem um controle de segurança rigoroso, podem causar danos irreparáveis aos usuários.

É por isso que a linguagem de aplicativo MQL5 foi criada protegida, sem a capacidade de chamar funções perigosas e trabalhando em sua própria área restrita. Há integração com bibliotecas DLL para ampliar a funcionalidade.

 
Renat:

Os programas MQ5/EX5 são muito fáceis de distribuir e, sem um controle rigoroso de segurança, podem causar danos irreparáveis aos usuários.

É por isso que a linguagem de aplicativos MQL5 foi projetada para ser protegida, sem a capacidade de chamar funções perigosas e trabalhando em sua própria sandbox. Há integração com bibliotecas DLL para ampliar a funcionalidade.

E quanto ao mercado?

Ou as win dlls serão permitidas no mercado?

Em geral, eu sei a resposta, por isso sugeri fazer essa implementação no padrão MQL5.