Librerie: Mappatura dei file senza DLL - pagina 7

 
o_O:

lib non si lega alle sezioni, perché teoricamente il codice può essere eseguito in processi diversi.

Per controllarlo, utilizzare la propria variante o https://www.mql5.com/it/code/1835, ad esempio.

Ho capito bene che se un mutex è nominato, posso ottenere il suo handle da qualsiasi processo, non solo da metatrader?
 
Al_key:
Ho capito bene che se il mutex è nominato, posso ottenere il suo handle da qualsiasi processo, non solo da metatrader?
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686931%28v=vs.85%29.aspx ho trovato la risposta da solo. In effetti, possono essere condivisi tra i processi.
 

Domanda per l'autore.

Utilizzo la classe in mt4. Se spengo e riaccendo il terminale, tutto smette di funzionare. La via d'uscita non è molto comoda: devo cancellare gli Expert Advisor prima di spegnere e collegarli dopo aver acceso il terminale. C'è un modo per aggirare questo problema?

E il secondo. Non riesco a leggere la mappatura dei file creata da un programma scritto in Delphi. Quali possono essere le sfumature.

In breve, si tratta di pannelli di trading che funzionano su molti terminali.

 
Dmitry Luck'janenko:


Se si spegne e si riaccende il terminale, tutto smette di funzionare. La via d'uscita non è molto comoda: cancellare gli EA prima dello spegnimento e collegarli dopo l'accensione del terminale. Esiste un modo per aggirare questo problema?

È necessario registrare e vedere cosa succede ai file durante tale deinizializzazione. Non ci sono blocchi.

Non riesco a leggere la mappatura dei file

Quale funzione di winapi si intende per "read"?

 
o_O:

È necessario registrare e vedere cosa succede ai file durante tale deinizializzazione. non ci sono blocchi.

Quale funzione di winapi si intende per "read"?

Il fatto è che la funzione

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

restituisce sempre 0.


Per questo non riesco a capire se il file è aperto.

Nell'immagine qui sopra c'è il log di Expert Advisor che apre una mappatura di file che non è ancora stata creata. E non ci sono errori.

Forse la funzione

CMemMapFile::Open

non dovrebbe essere inserita nell'int OnInit(), ma da qualche parte più avanti, per esempio in OnTick(), ma dato che l'handle restituito è sempre 0, non c'è la possibilità di fare un controllo per evitare di aprire il file costantemente ad ogni tick.

E per quanto riguarda la seconda domanda.

In Delphi ho creato un'applicazione che crea una mappatura di file. Quando la collego, si verificano degli errori. Vale a dire Numeri non passati correttamente. Ho cominciato ad allineare con {$Align Off}

Ho ottenuto altri errori come la violazione dell'accesso letto a 0x04E91000 in 'msvcrt.dll'.

Ora i dati sono allineati normalmente di 19 byte - "00:35:50.260 Panel v 1.00 GBPUSD.m,M5: OnInitsizeof(PipeData)= 19".


ma durante la lettura tutti i dati sono a zero.

 
Dmitry Luck'janenko:

Il fatto è che la funzione

restituisce sempre 0.

Per questo motivo non riesco a capire se il file è aperto.

Esatto, CMemMapFile::Open restituisce un codice di errore o 0 quando non c'è alcun errore.

(a differenza di CMemMapApi:, che restituisce un handle aperto e scrive l'errore nel parametro passato).

E l'handle è in m_hmem.



In delphi, si crea un'applicazione che crea una mappatura di file. Quando la si collega, si verificano degli errori. Vale a dire numeri non passati correttamente.

si tiene conto dei byte DWORD riservati all'inizio del file?
 
o_O:


Tieni conto dei byte DWORD riservati all'inizio del file?
4 byte? Proverò, non l'ho fatto.
 
Dmitry Luck'janenko:
4 byte? Proverò, non li ho contati.

Guarda come viene scritto o creato il file nel sorgente.

sul parametro m_size

 
o_O:

è corretto, CMemMapFile::Open restituisce un codice di errore o 0 se non ci sono errori.

(a differenza di CMemMapApi:, che restituisce un handle aperto e scrive l'errore nel parametro passato).

E l'handle è in m_hmem.


Tiene conto dei byte DWORD riservati all'inizio del file?
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 quando si apre una mappatura di file inesistente. Come determinare se si tratta di un errore o di un handle?

 
Dmitry Luck'janenko:

è m_hmem quando si apre una mappatura di file inesistente. Come determinare se si tratta di un errore o di un handle?

Ho scritto che CMemMapFile::Open restituisce un codice di errore o 0 quando non c'è alcun errore.