<папка терминала>\experts\samples\
в папке Dll Sample лежит проект проект dll для Visual C++. Там
есть примеры функций с передачей в dll массивов.
Вот две из них.
в папке Dll Sample лежит проект проект dll для Visual C++. Там
есть примеры функций с передачей в dll массивов.
Вот две из них.
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ MT4_EXPFUNC char* __stdcall GetStringValue(char *spar) { printf("GetDoubleValue takes \"%s\"\n",spar); return(spar); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ MT4_EXPFUNC double __stdcall GetArrayItemValue(const double *arr,const int arraysize,const int nitem) { //---- if(arr==NULL) { printf("GetArrayItemValue: NULL array\n"); return(0.0); } if(arraysize<=0) { printf("GetArrayItemValue: wrong arraysize (%d)\n", arraysize); return(0.0); } if(nitem<0 || nitem>=arraysize) { printf("GetArrayItemValue: wrong item number (%d)\n", nitem); return(0.0); } //---- return(arr[nitem]); }
Огромное спасибо, Lopatin !
Разобрался вроде как .. действительно под носом не заметил.
Только в этом примере к сожалению возврата массива нет,
подскажите можно ли как вернуть новый (пересчитанный)
массив обратно ? и не будет при этом утечки памяти ?
Разобрался вроде как .. действительно под носом не заметил.
Только в этом примере к сожалению возврата массива нет,
подскажите можно ли как вернуть новый (пересчитанный)
массив обратно ? и не будет при этом утечки памяти ?
Попробуй возвращать массив через параметры функции.
На С например:
На С например:
__declspec(dllexport) void __stdcall mt4_exp_func(double* out_arr,int arr_size) { for(int i=0;i<arr_size;i++) out_arr[i]=i; }
Тогда на mql4 вызов функции:
double array[3]; mt4_exp_func(array,3);
То есть ты передаешь результаты из функции dll в массив array.
Массив через параметры функции это как безопасное решение, пока мне этого хватит что бы разобраться ) А далее я так понял нужно через dllmain по завершении работы DLL-ки освобождать память, вопрос остался какие аттрибуты у памяти.
Такой вопрос еще, неделю(!) мучаюсь с lcc-win32 v2.4, и никак не могу добиться, что бы его DLL-ка работала с MT. Вместо пары-тройки мегабайт LCC пришлось разворачивать почти на гиг монстра MSVC. По lcc перечитал все форумы, все без единой ошибки или предупреждения, видна экспортируемая функция (a+b=c), MT с ручным подтверждением запрашивает (в эксперте) загружать функцию, при подтверждении - в журнале пишет ошибку 127. Тот же код почти без усилий компеллирует MSVC и все работает. Мне больше чем lcc и не нужно, может подскажите в чем может быть проблема или кто еще использует такой компайлер.
Такой вопрос еще, неделю(!) мучаюсь с lcc-win32 v2.4, и никак не могу добиться, что бы его DLL-ка работала с MT. Вместо пары-тройки мегабайт LCC пришлось разворачивать почти на гиг монстра MSVC. По lcc перечитал все форумы, все без единой ошибки или предупреждения, видна экспортируемая функция (a+b=c), MT с ручным подтверждением запрашивает (в эксперте) загружать функцию, при подтверждении - в журнале пишет ошибку 127. Тот же код почти без усилий компеллирует MSVC и все работает. Мне больше чем lcc и не нужно, может подскажите в чем может быть проблема или кто еще использует такой компайлер.
Память работы функции DLL нужно освобождать, если ты в ней выделял память для каких-либо данных. При передаче указателя на массив в mql4 ты получаешь его адрес, при этом выделение памяти в самой dll функции не происходит.
По поводу lcc могу сказать, что им не пользовался. Но предполагаю, что компилятор искажает имя экспортируемой функции (добавляет свои символы к имени функции).
Используй какой-нить дампер (например, tdump или dumpbin) и посмотри в разделе экспорта имя своей функции.
Для того чтобы не компилятор не искажал имя экспортируемой функции можно создать def-файл и включить раздел EXPORTS в котором будет имя функции:
EXPORTS
MyFuncExp,
либо использовать директиву #pragma:
#pragma comment(linker, "/export:MyFuncExp=_MyFuncExp@8") .
ещё можно можно использовать спецификатор extern "C",
например:
extern "C" __declspec(dllexport) int __stdcall MyFuncExp()
{
return 321;
}
По поводу lcc могу сказать, что им не пользовался. Но предполагаю, что компилятор искажает имя экспортируемой функции (добавляет свои символы к имени функции).
Используй какой-нить дампер (например, tdump или dumpbin) и посмотри в разделе экспорта имя своей функции.
Для того чтобы не компилятор не искажал имя экспортируемой функции можно создать def-файл и включить раздел EXPORTS в котором будет имя функции:
EXPORTS
MyFuncExp,
либо использовать директиву #pragma:
#pragma comment(linker, "/export:MyFuncExp=_MyFuncExp@8") .
ещё можно можно использовать спецификатор extern "C",
например:
extern "C" __declspec(dllexport) int __stdcall MyFuncExp()
{
return 321;
}
Такой вопрос еще, неделю(!) мучаюсь с lcc-win32 v2.4, и никак не могу добиться, что бы его DLL-ка работала с MT. Вместо пары-тройки мегабайт LCC пришлось разворачивать почти на гиг монстра MSVC. По lcc перечитал все форумы, все без единой ошибки или предупреждения, видна экспортируемая функция (a+b=c), MT с ручным подтверждением запрашивает (в эксперте) загружать функцию, при подтверждении - в журнале пишет ошибку 127. Тот же код почти без усилий компеллирует MSVC и все работает. Мне больше чем lcc и не нужно, может подскажите в чем может быть проблема или кто еще использует такой компайлер.
Всё просто! LCC по умолчанию экспортирует функции, назначая им имена типа _yourfunc@12, вместо yourfunc. Чтобы заставить его это не делать, достаточно в Project -> Configuration -> Linker установить галку в "Do not include underscores in dll exports".
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Понимаю что вопрос может и элементарный, но моих знаний и опыта не хватает. Знаю только что есть заморочки с перераспределением памяти и утечкой памяти при некорректной работе приложения с DLL.