Discussione sull’articolo "Sbarazzarsi delle DLL auto-prodotte" - pagina 4

 
Maxim Kuznetsov #:

l'ultimo parametro (che è cnt) è anch'esso a 64 bit. È size_t

https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/memcpy-wmemcpy

Grazie.

 
Maxim Kuznetsov #:

Certo che lo fa... prototipi da 4 (indirizzo a 32 bit come unsigned int), e compilazione/esecuzione in 5 (ha 64).

Ritardato, io stesso ho scritto via longs prima.

#define  MEMCPY_MACROS(A)                                                     \
long memcpy( const long Destination, const A &Source[], const uint Length ); \
long memcpy( A &Destination[], const long Source, const uint Length );
 
Edgar Akhmadeev #:

Ho perso il punto con l'indirizzo a 64 bit. Ma mi sto ancora bloccando 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.

Ho trovato un errore, perché la versione corretta non ha funzionato per me. Ho commesso un errore di battitura, non ho capito bene e in un punto.

La mia opinione è cambiata, grazie a tutti.

 

A proposito, MS considera la funzione memcpy non sicura e obsoleta e suggerisce invece memcpy_s. Inoltre, il primo parametro non è const. Quindi il risultato è:

#define  DEF_MEMCPY_S(T)                                                   \
        ulong memcpy_s(T &dst,   ulong size, const ulong src, ulong cnt); \
        ulong memcpy_s(T &dst[], ulong size, const ulong src, ulong cnt); \
        ulong memcpy_s(T &dst,   ulong size, const T &src[],  ulong cnt); \
        ulong memcpy_s(T &dst[], ulong size, const T &src[],  ulong cnt);
        
#import "msvcrt.dll"
        DEF_MEMCPY_S(char)
        DEF_MEMCPY_S(uchar)
        DEF_MEMCPY_S(int)
        DEF_MEMCPY_S(uint)
        DEF_MEMCPY_S(long)
        DEF_MEMCPY_S(ulong)
#import



void OnStart() {
        int Array[];
        ArrayResize(Array, 1);
        Array[0] = 123;
        int Value1 = 0;
        int Value2 = 0;
        
        ulong Address = memcpy(Array, 0, 0);
        memcpy_s(Value1, sizeof(int), Address, sizeof(int));
        
        memcpy_s(Value2, sizeof(int), Array,   sizeof(int));
        
        Print(Value1, " ", Value2);
}
 

Esempi interessanti. Domanda per i conoscitori. È possibile ottenere l'indirizzo di un vettore, una matrice, un oggetto di qualsiasi classe?

 
Denis Kirichenko #:

Esempi interessanti. Una domanda per i conoscitori. È possibile ottenere l'indirizzo di un vettore, una matrice, un oggetto di qualsiasi classe?

no