Dmitri Custurov #: Интересно, можно ли получить реальный указатель на функцию. Указатели, полученные с помощью typedef, отлично работают внутри mql программы. Но к сожалению передать в dll мне их не удалось.
Если с++ + встроенный ассемблер можешь и в курсе что и как в стек кладется, а термины дальний и ближний вызов понятны, то можешь попробовать. Гарантию, что получится не дам, но по идее можно.
#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
}
Ваш пример в коде совсем иной. Я пытаюсь взять значение по адресу.
В статье есть пример.
#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//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//--- открываем объект памятиint hmem=OpenFileMappingW(FILE_MAP_ALL_ACCESS, 0, "Local\\file");
//--- получаем указатель на памятьint view=MapViewOfFile(hmem, FILE_MAP_ALL_ACCESS, 0, 0, 0);
//--- читаем первые 10 байт из памятиuchar src[10];
memcpy(src, view, 10);
int num=10;
//--- записываем в начало памяти 4 байтовое int число
memcpy(view, num, 4);
//--- закрываем просмотр
UnmapViewOfFile(view);
//--- закрываем объект
CloseHandle(hmem);
}
Выделил места, где идет запись по адресу. Однако, этот пример из статьи тоже вызывает краш.
Ваш пример в коде совсем иной. Я пытаюсь взять значение по адресу.
В статье есть пример.
Выделил места, где идет запись по адресу. Однако, этот пример из статьи тоже вызывает краш.
Я сразу понял, что Вы хотели. Уверен, что адрес, возвращаемый из WinAPI функций, нельзя использовать в MQL5. А вот в аргументы адрес передаётся верно.
Абсолютно убедиться можно было бы, написав простейшую DLL, которая показывает получаемый в аргументе адрес, и возвращает его. И сравнить в MQL5 результат. Здесь многие практикуют C.
Ваш пример в коде совсем иной. Я пытаюсь взять значение по адресу.
В статье есть пример.
Выделил места, где идет запись по адресу. Однако, этот пример из статьи тоже вызывает краш.
конечно вызывает..прототипы от 4-ки (32-х битный адрес а-ля unsigned int), а компилишь/запускаешь в 5-ке (у неё 64)
никому нельзя доверять, используешь WinAPI - пиши прототипы сам. А лучше писать свою DLL, пусть она дёргает winapi, а наверх в mql отдаёт интерфейсы более высокого уровня
Я момент с 64bit-адресом упустил. Но у меня с исправленным адресом всё равно крашится. Это точно должно работать? Полный пример исправленного кода fxsaber можно?
Пока что я при своём мнении - адрес из WinAPI несовместим с MQL.
Интересно, можно ли получить реальный указатель на функцию. Указатели, полученные с помощью typedef, отлично работают внутри mql программы. Но к сожалению передать в dll мне их не удалось.
Если с++ + встроенный ассемблер можешь и в курсе что и как в стек кладется, а термины дальний и ближний вызов понятны, то можешь попробовать. Гарантию, что получится не дам, но по идее можно.
Где ошибка?
Ваш пример в коде совсем иной. Я пытаюсь взять значение по адресу.
В статье есть пример.
Ваш пример в коде совсем иной. Я пытаюсь взять значение по адресу.
В статье есть пример.
Выделил места, где идет запись по адресу. Однако, этот пример из статьи тоже вызывает краш.Я сразу понял, что Вы хотели. Уверен, что адрес, возвращаемый из WinAPI функций, нельзя использовать в MQL5. А вот в аргументы адрес передаётся верно.
Абсолютно убедиться можно было бы, написав простейшую DLL, которая показывает получаемый в аргументе адрес, и возвращает его. И сравнить в MQL5 результат. Здесь многие практикуют C.
Где ошибка?
Исправил ваше:
У вас везде Lenght должен быть не более 4
Копирование более 2Гб работает
Получение начального адреса массива:
Ваш пример в коде совсем иной. Я пытаюсь взять значение по адресу.
В статье есть пример.
Выделил места, где идет запись по адресу. Однако, этот пример из статьи тоже вызывает краш.конечно вызывает..прототипы от 4-ки (32-х битный адрес а-ля unsigned int), а компилишь/запускаешь в 5-ке (у неё 64)
никому нельзя доверять, используешь WinAPI - пиши прототипы сам. А лучше писать свою DLL, пусть она дёргает winapi, а наверх в mql отдаёт интерфейсы более высокого уровня
Копирование более 2Гб работает
Получение начального адреса массива:
Я момент с 64bit-адресом упустил. Но у меня с исправленным адресом всё равно крашится. Это точно должно работать? Полный пример исправленного кода fxsaber можно?
Пока что я при своём мнении - адрес из WinAPI несовместим с MQL.
Исправил ваше:
конечно вызывает..прототипы от 4-ки (32-х битный адрес а-ля unsigned int), а компилишь/запускаешь в 5-ке (у неё 64)
Спасибо, теперь работает.
последний параметр (который cnt) тоже 64 бита. Он size_t
https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/memcpy-wmemcpy