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

 
o_O:

A lib não se vincula a seções porque, teoricamente, o código pode ser executado em diferentes processos.

Para controlá-lo, use sua variante ou https://www.mql5.com/pt/code/1835, por exemplo.

Entendi corretamente que, se um mutex for nomeado, poderei obter seu controle de qualquer processo, não apenas do metatrader?
 
Al_key:
Entendi corretamente que, se o mutex for nomeado, poderei obter seu identificador de qualquer processo, não apenas do metatrader?
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686931%28v=vs.85%29.aspx Eu mesmo encontrei a resposta. De fato, eles podem ser compartilhados entre processos.
 

Pergunta para o autor.

Eu uso a classe no mt4. Se eu desligar e ligar o terminal, tudo para de funcionar. A saída não é muito conveniente: excluir os Expert Advisors antes de desligar e anexá-los depois de ligar o terminal. Existe alguma maneira de contornar esse problema?

E a segunda. Não consigo ler o mapeamento de arquivos criado por um programa escrito em Delphi. Quais podem ser as nuances.

Resumidamente, esses são painéis de negociação que funcionam em vários terminais.

 
Dmitry Luck'janenko:


Se você desligar e ligar o terminal, tudo para de funcionar. A saída não é muito conveniente, pois é preciso excluir os EAs antes de desligar e anexá-los depois de ligar o terminal. Existe alguma maneira de contornar esse problema?

É necessário registrar e ver o que acontece com os arquivos durante essa desinicialização.

Não consigo ler o mapeamento de arquivos

Qual é a função do winapi que se refere a "ler"?

 
o_O:

É necessário registrar e ver o que acontece com os arquivos durante essa desinicialização. não há bloqueios.

qual função do winapi é chamada de "read" (ler)?

O fato é que a função

HANDLE64 CMemMapFile::Open(LPTSTR path, DWORD size, int mode=modeOpen)

sempre retorna 0.


É por isso que não consigo entender se o arquivo está aberto.

Na imagem acima está o registro do Expert Advisor abrindo um mapeamento de arquivo que ainda não foi criado. E não há erros.

Talvez a função

CMemMapFile::Open

não deva ser inserida em int OnInit(), mas em algum lugar mais adiante, por exemplo, em OnTick(), mas como o identificador retornado é sempre 0, não há possibilidade de fazer uma verificação para evitar a abertura constante do arquivo a cada tick.

E quanto à segunda pergunta.

No Delphi, criei um aplicativo que cria um mapeamento de arquivo. Ao conectá-lo, ocorrem erros. Ou seja, números não passados corretamente. Comecei a alinhar com {$Align Off}

Recebi outros erros, como Access violation read to 0x04E91000 in 'msvcrt.dll'.

Agora os dados estão alinhados normalmente em 19 bytes - "00:35:50.260 Panel v 1.00 GBPUSD.m,M5: OnInitsizeof(PipeData)= 19".


mas, ao ler, todos os dados são zero.

 
Dmitry Luck'janenko:

O problema é que a função

sempre retorna 0.

É por isso que não consigo entender se o arquivo está aberto.

É isso mesmo, CMemMapFile::Open retorna um código de erro ou 0 quando não há erro.

(ao contrário de CMemMapApi:, que retornará um identificador aberto e gravará o erro no parâmetro passado).

E o identificador está em m_hmem.



No delphi, você cria um aplicativo que cria um mapeamento de arquivo. Ao conectá-lo, ocorrem erros. Ou seja, números não passados corretamente.

Você leva em conta os bytes DWORD reservados no início do arquivo?
 
o_O:


Você leva em conta os bytes DWORD reservados no início do arquivo?
4 bytes? Vou tentar, mas não levei.
 
Dmitry Luck'janenko:
4 bytes? vou tentar, não contei.

Veja como o arquivo é gravado ou criado na fonte.

no parâmetro m_size

 
o_O:

estiver correto, CMemMapFile::Open retorna um código de erro ou 0 quando não há erro.

(ao contrário de CMemMapApi:, que retornará um identificador aberto e gravará o erro no parâmetro passado).

E o identificador está em m_hmem.


Você leva em conta os bytes DWORD reservados no início do arquivo?
2016.03.04 19:00:00.897 BuyNow Client v 1.03 USDCHF.m,M5: BuyNow Client v 1.03.mq4, handle=8589934592


é m_hmem ao abrir um mapeamento de arquivo inexistente. Como determinar se isso é um erro ou um identificador?

 
Dmitry Luck'janenko:

é m_hmem ao abrir um mapeamento de arquivo inexistente. Como determinar se é um erro ou um identificador?

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