Обсуждение статьи "Избавляемся от балласта самодельных DLL" - страница 4

 
Maxim Kuznetsov #:

последний параметр (который cnt) тоже 64 бита. Он size_t 

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

Спасибо.

 
Maxim Kuznetsov #:

конечно вызывает..прототипы от 4-ки (32-х битный адрес а-ля unsigned int), а компилишь/запускаешь в 5-ке (у неё 64)

Стормозил, сам же ранее писал через лонги.

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

Я момент с 64bit-адресом упустил. Но у меня с исправленным адресом всё равно крашится. Это точно должно работать? Полный пример исправленного кода fxsaber можно?

Пока что я при своём мнении - адрес из WinAPI несовместим с MQL.

Нашёл ошибку, почему у меня исправленный вариант не заработал. Опечатку сделал, упустил & в одном месте.

Своё мнение изменил, всем спасибо.

 

Кстати, MS считает функцию memcpy небезопасной и устаревшей, и предлагает взамен memcpy_s. Кроме того, первый параметр - не const. Так что в результате:

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

Интересные примеры. Вопрос к знатокам. Можно ли как-то получить адрес вектора, матрицы, объекта какого-либо класса?

 
Denis Kirichenko #:

Интересные примеры. Вопрос к знатокам. Можно ли как-то получить адрес вектора, матрицы, объекта какого-либо класса?

нет