In MQL5 c'è sempre spazio per un exploit! ;) - pagina 5

 
sergeev:

Non credo, non puoi spingere megabyte di informazioni attraverso OBJ_TEXT.

il candidato più vicino è le risorse

Nota: un punto è in realtà una struttura piena di variabili di diversi tipi. Viene salvato quando si chiude/apre il terminale e anche salvato in un modello.

 
DC2008:

Nota: un punto è in realtà una struttura piena di variabili di diversi tipi. Viene salvato quando si chiude/apre il terminale ed è anche salvato nel modello.

?
 
sergeev:

Continuo a chiedere, avete già trovato una soluzione per DLL 32/64?

C'è una specie di WOW32reg.exe nel sistema (\System32\). Ho girato in lungo e in largo, non risponde a -h -?, non ho potuto registrare nulla alla cieca.

Anche Google è silenzioso, non sono riuscito a trovare nulla su microsoft.com... quindi è abbastanza figo.

 
sergeev:
?

Cosa non è chiaro? Dammi un compito concreto, ma è tutto un giro di parole...?

 
MetaDriver:

Continuo a chiedere: avete già trovato una soluzione per DLL 32/64?

C'è una specie di WOW32reg.exe nel sistema (\System32\). Ho girato in lungo e in largo, non risponde a -h -?, non ho potuto registrare nulla alla cieca.

Anche Google è silenzioso, non ho trovato nulla su microsoft.com... in generale, è acuto.

Quindi, è solo un'idea, non l'ho provata io stesso. Dopo aver rilevato la profondità di bit del terminale, usate LoadLibrary per caricare dinamicamente la DLL.

 
MetaDriver:

Continuo a chiedere, avete già trovato una soluzione per DLL 32/64 ?

Qual è il problema qui?

In import si specificano due funzioni identiche, solo con parametri diversi (int/long). Nel programma, a seconda del 32/64 bit, si chiama la funzione corrispondente.

 
MetaDriver:

Continuo a chiedere, avete già trovato una soluzione per DLL 32/64 ?

Il codice per chiamare funzioni da quelle del vento (quando si passano puntatori a queste) - trovato.

Grazie al contesto :: tutto è risolto ordinatamente.


Yurich:

In import si specificano due funzioni identiche, solo con parametri diversi (int/long). Nel programma, a seconda del 32/64 bit, si chiama la funzione corrispondente.


Ad esempio così:

#import "MemMap32.dll"
int MemRead(HANDLE32 hmem, int &v[], int pos, int sz, int &err); // чтение вектора v с указанной позиции pos размером sz
#import "MemMap64.dll"
int MemRead(HANDLE64 hmem, int &v[], int pos, int sz, int &err); // чтение вектора v с указанной позиции pos размером sz
#import

// переопределяем вызовы для контроля битности
int MemRead(HANDLE64 h, int &v[], int pos, int sz, int &error) { if (_IsX64) return(MemMap64::MemRead(h, v, pos, sz, error)); return(MemMap32::MemRead((HANDLE32)h, v, pos, sz, error));  }
in un codice che chiamate con esplicito :: context.

::MemRead(...)


Cioè, non moltiplichiamo i nomi delle funzioni, ma facciamo l'autodetection del bit rate e chiamiamo quella importata correttamente.

 
MetaDriver:

Continuo a chiedermi: avete già trovato una soluzione per 32/64 DLL?

Il modo più semplice è mettere le DLL x32 e x64 con lo stesso nome in diverse directory del sistema Windows - SysWOW64 e System32, rispettivamente.

Ma lo scambio di dati interprogramma è davvero un problema, soprattutto se lo si affronta a caso.
Così probabilmente ragionato e Microsoft, quando negli anni novanta del secolo scorso, è andato da un file, flusso di scambio per oggetto - OLE da esso a ActiveX -> COM -> COM + -> .NET, cioè basato su una tecnologia di scambio interprogramma hanno creato un nuovo sistema di programmazione ed esecuzione del codice.

 
Yurich:

Qual è il problema qui?

In import si specificano due funzioni identiche, solo con parametri diversi (int/long). Nel programma, si chiama la funzione appropriata a seconda della dimensione del bit 32/64.

Non vuole affatto caricare quella a 32 bit, e non vuole eseguire il programma anche se non lo chiamo già (la dll).

Se"Allow use of DLL" è deselezionato, il pulsante [OK] non viene visualizzato affatto, solo annullato. Allow, clicca su OK - il programma si blocca. Deadlock.

2013.12.19 17:43:20.657 TestFFTdll      'E:\Programs\MetaQuotes_MT5\MQL5\Libraries\fft32.dll' is not 64-bit version


Idealmente, vorrei essere in grado di chiamare dll32 nel terminale x64. So per certo che è teoricamente possibile, ma non so come.

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе - Документация по MQL5
 
MetaDriver:

Non vuole affatto caricare quello a 32 bit, e non vuole eseguire il programma anche se non lo chiamo più (dll).

Quando"Allow dll" è deselezionato, il pulsante [OK] non viene visualizzato affatto, solo annullato. Allow, clicca OK - il programma si blocca. Deadlock.


Idealmente, vorrei essere in grado di chiamare dll32 nel terminale x64. So per certo che è teoricamente possibile, ma non so come.

Ho appena controllato:
2013.12.19 18:49:01.437    do (EURUSD,H1)    TEST
2013.12.19 18:49:01.436    do (EURUSD,H1)    Cannot load 'E:\MT5_REV1\Client\MetaTrader5Terminal\Final\MQL5\Libraries\test.dll'
2013.12.19 18:48:58.929    do    'E:\MT5_REV1\Client\MetaTrader5Terminal\Final\MQL5\Libraries\test.dll' is not 64-bit version
La libreria non viene caricata, ma tutto funziona finché la sua funzione non viene chiamata (uscita TEST);

Ora chiamiamo la funzione di tale libreria:
2013.12.19 18:51:07.446    do (EURUSD,H1)    unresolved import function call
2013.12.19 18:51:07.446    do (EURUSD,H1)    Cannot call 'fnCrashTest', 'test.dll' is not loaded
2013.12.19 18:51:07.445    do (EURUSD,H1)    Cannot load 'E:\MT5_REV1\Client\MetaTrader5Terminal\Final\MQL5\Libraries\test.dll'
2013.12.19 18:51:05.107    do    'E:\MT5_REV1\Client\MetaTrader5Terminal\Final\MQL5\Libraries\test.dll' is not 64-bit version