Bibliotecas: Mapeado de Ficheros sin la DLL - página 7

 
o_O:

lib no se vincula a secciones, porque teóricamente el código puede ejecutarse en diferentes procesos.

Para controlarlo, utiliza su variante o https://www.mql5.com/es/code/1835 por ejemplo.

¿He entendido bien que si se nombra un mutex, puedo obtener su handle desde cualquier proceso, no sólo desde metatrader?
 
Al_key:
¿Entendí correctamente que si el mutex es nombrado, puedo obtener su handle desde cualquier proceso, no solo desde metatrader?
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686931%28v=vs.85%29.aspx encontré la respuesta yo mismo. Efectivamente, se pueden compartir entre procesos.
 

Pregunta para el autor.

Yo uso la clase en mt4. Si apago y enciendo el terminal, todo deja de funcionar. La salida no es muy conveniente para eliminar Asesores Expertos antes de apagar y adjuntarlos después de encender el terminal. Hay alguna forma de eludir este problema.

Y la segunda. No puedo leer el mapeo de archivos creado por un programa escrito en Delphi. Cuáles pueden ser los matices.

Brevemente, se trata de paneles de negociación que funcionan en muchos terminales.

 
Dmitry Luck'janenko:


Si apagas y enciendes el terminal, todo deja de funcionar. La salida no es muy conveniente para eliminar EAs antes de apagar y adjuntarlos después de encender el terminal. ¿Hay alguna manera de solucionar este problema?

Es necesario registrar y ver lo que sucede con los archivos durante dicha desinicialización. no hay ningún bloqueo.

No puedo leer la asignación de archivos

¿qué función de winapi se entiende por "leer"?

 
o_O:

Es necesario registrar y ver qué ocurre con los archivos durante dicha desinicialización. no hay bloqueos.

¿a qué función de winapi se refiere "leer"?

El caso es que la función

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

siempre devuelve 0.


Por eso no puedo entender si el fichero está abierto.

En la imagen de arriba está el log del Expert Advisor abriendo un mapeo de fichero que aún no se ha creado. Y no hay errores.

Quizás la función

CMemMapFile::Open

debería insertarse no en int OnInit(), sino en algún sitio más adelante, por ejemplo, en OnTick(), pero como el handle devuelto es siempre 0, no hay posibilidad de hacer una comprobación para evitar abrir el fichero constantemente con cada tick.

Y sobre la segunda pregunta.

En Delphi creo una aplicación que crea un mapeo de ficheros. Al conectarla se producen errores. A saber No se pasan correctamente los números. Empecé a alinear con {$Align Off}

Obtuve otros errores como Access violation read to 0x04E91000 in 'msvcrt.dll'.

Ahora los datos se alinean normalmente por 19 bytes - "00:35:50.260 Panel v 1.00 GBPUSD.m,M5: OnInitsizeof(PipeData)= 19".


pero al leer todos los datos son cero.

 
Dmitry Luck'janenko:

La cuestión es que la función

siempre devuelve 0.

Por eso no puedo entender si el fichero está abierto.

Así es, CMemMapFile::Open devuelve un código de error o 0 cuando no hay error.

(a diferencia de CMemMapApi:, que devolverá un handle abierto y escribirá el error en el parámetro pasado).

Y el handle está en m_hmem.



En delphi, creas una aplicación que crea un mapeo de ficheros. Al conectarla, se producen errores. A saber Números no pasados correctamente.

¿ Tiene en cuenta los bytes DWORD reservados al principio del fichero ?
 
o_O:


¿tiene en cuenta los bytes DWORD reservados al principio del fichero?
¿4 bytes? lo intentaré, no lo hice.
 
Dmitry Luck'janenko:
¿4 bytes? Lo probaré, no lo he contado.

mira como se escribe o se crea el archivo en la fuente.

en el parámetro m_size

 
o_O:

es correcto, CMemMapFile::Open devuelve un código de error o 0 cuando no hay error.

(a diferencia de CMemMapApi:, que devolverá un handle abierto y escribirá el error en el parámetro pasado).

Y el handle está en m_hmem.


Tiene en cuenta los bytes DWORD reservados al principio del fichero ?
2016.03.04 19:00:00.897 BuyNow Client v 1.03 USDCHF.m,M5: BuyNow Client v 1.03.mq4, handle=8589934592


es m_hmem al abrir una asignación de archivo inexistente. ¿Cómo determinar si se trata de un error o de un handle?

 
Dmitry Luck'janenko:

es m_hmem al abrir una asignación de archivo inexistente. ¿Cómo determinar si es un error o un handle?

Escribí que CMemMapFile::Open devuelve un código de error o 0 cuando no hay error.