Dmitri Custurov #: Mi chiedo se sia possibile ottenere un vero puntatore a una funzione. I puntatori ottenuti tramite typedef funzionano perfettamente all'interno del programma mql. Ma purtroppo non sono riuscito a passarli nella dll.
Se conoscete il C++ e l'assemblatore integrato e sapete cosa e come inserire nello stack, e se i termini far e near call sono chiari, potete provare. Non posso garantire che funzionerà, ma è possibile.
#import "msvcrt.dll"int memcpy(int &dst, int &src[], int cnt);
int memcpy(int &dst[], int &src[], int cnt);
#import
voidOnStart() {
int Array[];
ArrayResize(Array, 1);
Array[0] = 123;
int Value = 0;
msvcrt::memcpy(Value, Array, sizeof(int));
Print(Value); // 123
}
Il tuo esempio nel codice è molto diverso. Sto cercando di ottenere il valore dall'indirizzo.
C'è un esempio nell'articolo.
#import "kernel32.dll"int OpenFileMappingW(int dwDesiredAccess, int bInheritHandle, string lpName);
int MapViewOfFile(int hFileMappingObject, int dwDesiredAccess,
int dwFileOffsetHigh, int dwFileOffsetLow, int dwNumberOfBytesToMap);
int UnmapViewOfFile(int lpBaseAddress);
int CloseHandle(int hObject);
#import "msvcrt.dll"int memcpy(uchar &Destination[], int Source, int Length);
int memcpy(int Destination, int &Source, int Length);
int memcpy(int Destination, uchar &Source[], int Length);
#import
#define FILE_MAP_ALL_ACCESS 0x000F001F//+------------------------------------------------------------------+//| Funzione di avvio del programma di script|//+------------------------------------------------------------------+voidOnStart()
{
//--- aprire l'oggetto di memoriaint hmem=OpenFileMappingW(FILE_MAP_ALL_ACCESS, 0, "Local\\file");
//--- ottenere il puntatore alla memoriaint view=MapViewOfFile(hmem, FILE_MAP_ALL_ACCESS, 0, 0, 0);
//--- leggere i primi 10 byte dalla memoriauchar src[10];
memcpy(src, view, 10);
int num=10;
//--- scrivere un numero int di 4 byte all'inizio della memoria
memcpy(view, num, 4);
//--- chiudere la vista
UnmapViewOfFile(view);
//--- chiudere l'oggetto
CloseHandle(hmem);
}
Ho evidenziato i punti in cui è scritto per indirizzo. Tuttavia, anche questo esempio dell'articolo si blocca.
Il tuo esempio nel codice è molto diverso. Sto cercando di ottenere il valore dall'indirizzo.
C'è un esempio nell'articolo.
Ho evidenziato i punti in cui è scritto per indirizzo. Tuttavia, anche questo esempio dell'articolo causa un arresto anomalo.
Ho capito subito cosa volevate. Sono sicuro che l'indirizzo restituito dalle funzioni WinAPI non può essere utilizzato in MQL5. Ma l'indirizzo viene passato correttamente agli argomenti.
Si può essere assolutamente sicuri scrivendo una semplice DLL che mostri l'indirizzo ricevuto nell'argomento e lo restituisca. E confrontare il risultato in MQL5. Molte persone qui praticano il C.
Il tuo esempio nel codice è molto diverso. Sto cercando di ottenere il valore dall'indirizzo.
C'è un esempio nell'articolo.
Ho evidenziato i punti in cui è scritto per indirizzo. Tuttavia, anche questo esempio dell'articolo causa un arresto anomalo.
Certo che lo fa... i prototipi sono in 4 (indirizzo a 32 bit come l'unsigned int), e voi li compilate/eseguite in 5 (ha 64).
Non potete fidarvi di nessuno, se usate WinAPI - scrivete voi stessi i prototipi. O meglio scrivere la propria DLL, lasciare che tiri winapi, e di sopra in mql dà interfacce di livello superiore
Ho perso il punto con l'indirizzo a 64 bit. Ma ho ancora un crash con l'indirizzo corretto. È sicuro che dovrebbe funzionare? Posso vedere un esempio completo del codice fxsaber corretto?
Finora sono ancora della mia opinione: l'indirizzo di WinAPI è incompatibile con MQL.
Mi chiedo se sia possibile ottenere un vero puntatore a una funzione. I puntatori ottenuti tramite typedef funzionano perfettamente all'interno del programma mql. Ma purtroppo non sono riuscito a passarli nella dll.
Se conoscete il C++ e l'assemblatore integrato e sapete cosa e come inserire nello stack, e se i termini far e near call sono chiari, potete provare. Non posso garantire che funzionerà, ma è possibile.
Dov'è l'errore?
Il tuo esempio nel codice è molto diverso. Sto cercando di ottenere il valore dall'indirizzo.
C'è un esempio nell'articolo.
Il tuo esempio nel codice è molto diverso. Sto cercando di ottenere il valore dall'indirizzo.
C'è un esempio nell'articolo.
Ho evidenziato i punti in cui è scritto per indirizzo. Tuttavia, anche questo esempio dell'articolo causa un arresto anomalo.Ho capito subito cosa volevate. Sono sicuro che l'indirizzo restituito dalle funzioni WinAPI non può essere utilizzato in MQL5. Ma l'indirizzo viene passato correttamente agli argomenti.
Si può essere assolutamente sicuri scrivendo una semplice DLL che mostri l'indirizzo ricevuto nell'argomento e lo restituisca. E confrontare il risultato in MQL5. Molte persone qui praticano il C.
Dov'è l'errore?
Corretto il tuo:
Dovresti avere una lunghezza di 4 o meno ovunque
Copiare più di 2GB funziona
Ottenere l'indirizzo iniziale di un array:
Il tuo esempio nel codice è molto diverso. Sto cercando di ottenere il valore dall'indirizzo.
C'è un esempio nell'articolo.
Ho evidenziato i punti in cui è scritto per indirizzo. Tuttavia, anche questo esempio dell'articolo causa un arresto anomalo.Certo che lo fa... i prototipi sono in 4 (indirizzo a 32 bit come l'unsigned int), e voi li compilate/eseguite in 5 (ha 64).
Non potete fidarvi di nessuno, se usate WinAPI - scrivete voi stessi i prototipi. O meglio scrivere la propria DLL, lasciare che tiri winapi, e di sopra in mql dà interfacce di livello superiore
La copia di più di 2GB funziona
Ottenere l'indirizzo iniziale dell'array:
Ho perso il punto con l'indirizzo a 64 bit. Ma ho ancora un crash con l'indirizzo corretto. È sicuro che dovrebbe funzionare? Posso vedere un esempio completo del codice fxsaber corretto?
Finora sono ancora della mia opinione: l'indirizzo di WinAPI è incompatibile con MQL.
Riparato il tuo:
certo che lo fa... i prototipi sono da 4 (indirizzo a 32 bit come unsigned int) e compilano/eseguono in 5 (ha 64).
Grazie, ora funziona.
Anche l'ultimo parametro (che è cnt) è a 64 bit. È size_t
https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/memcpy-wmemcpy