Discussion de l'article "Se débarrasser des DLL auto-produites" - page 4

 
Maxim Kuznetsov #:

le dernier paramètre (qui est cnt) est également de 64 bits. Il s'agit de size_t

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

Merci.

 
Maxim Kuznetsov #:

Bien sûr que oui... les prototypes sont en 4 (adresse 32 bits à la manière des unsigned int), et vous compilez/exécutez en 5 (il y en a 64).

Retardé, j'ai écrit via des longs tout à l'heure moi-même.

#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 #:

Je n'ai pas compris l'intérêt de l'adresse 64bit. Mais je plante toujours avec l'adresse corrigée. Est-il sûr que cela devrait fonctionner ? Puis-je voir un exemple complet du code corrigé de fxsaber ?

Jusqu'à présent, je suis toujours d'avis que l'adresse de WinAPI est incompatible avec MQL.

J'ai trouvé une erreur qui explique pourquoi la version corrigée n'a pas fonctionné pour moi. J'ai fait une faute de frappe, je l'ai oubliée & à un endroit.

Mon opinion a changé, merci à tous.

 

D'ailleurs, MS considère que la fonction memcpy n'est pas sûre et qu'elle est obsolète, et suggère de la remplacer par memcpy_s. En outre, le premier paramètre n'est pas constant. Le résultat est donc le suivant :

#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);
}
 

Exemples intéressants. Une question pour les connaisseurs. Est-il possible d'obtenir l'adresse d'un vecteur, d'une matrice, d'un objet de n'importe quelle classe ?

 
Denis Kirichenko #:

Exemples intéressants. Une question pour les connaisseurs. Est-il possible d'obtenir l'adresse d'un vecteur, d'une matrice, d'un objet de n'importe quelle classe ?

non