Вызов функций из dll и возврат результатов - страница 6

 
То f1-forum
Mike = Terranin = я :) А эмулятор я уже Вам отдал на форуме Альпари. МТС меня не особенно интересует, если бы Вы знали сколько их разбилось об мой эмулятор... :)
 
2 mike
:)) Я так и думал. А про мою систему если вдруг заинтересует можно полядеть здесь
http://forum.alpari-idc.ru/viewtopic.php?t=45555
Там конешно развели бодягу...
Если захочешь то опишу систему, так как ты мне помог с эмулятором.
 
Ок, если есть желание поделиться то на murdoc (at) newmail.ru. Будет свободное время прогоню на своем тестере и сообщу результаты.
 
Renat:
По _умолчанию_ любой импорт из DLL _полностью_запрещен_. Это и есть защита.
Если кто хочет использовать внешние DLL, то достаточно включить кнопку "Подтверждать вызов каждой DLL функции" и посмотреть что же там вызывается. Это тоже - защита. Так же как и защита всех встроенных файловых операций доступом только к каталогам /history и /files.

Если некий человек предлагает общественности эксперта со своей DLL, то пользователь либо доверяет этой DLL либо нет. Если не доверяет, то он и качать не будет, если доверяет то по любому придется ставить галочку "Разрешить импорт функций из DLL", иначе эксперт работать не будет. Имена вызываемых функций ему тоже ничего полезного не скажут, потому что, чтобы узнать, что делает какая-то функция, придется эту DLL дизассемблировать, что не каждый сможет. А в этой DLL много пакостей натворить можно, терминал MT этому воспрепятствовать не сможет. Так что "защита" весьма условна, и не является реальной защитой в данном контексте. Думаю это и имел в виду mike.

Возможность вызова функций из пользовательских DLL в экспертах МТ 4 позиционируется как замена API, который есть в MT 3. Таким образом все, же имеется возможность превращения терминала МТ 4 в датафид и выставлялки ордеров, что являлось одной из причин (судя по различным темам на форумах) почему API убрали. Но возможность осталась, очень неудобная, об этом многие пользователи говорят, и напоминает ситуацию из анекдота ".... мне все равно, лишь бы вы задолбались.". И данная тема лишнее тому подтверждения. Автор так и не получил конкретных и информативных ответов на свои вопросы. Для меня эти вопросы тоже актуальны, еще актуальнее ответы на них :-).
Может я тоже не далек в программировании, но в текущей системе эксперт<->DLL простого и красивого решения не может быть по определению. Точнее в рамках языка MQL4 может и есть красивое решение, но в рамках интеграции терминала МТ 4 с пользовательским софтом, это, мягко говоря, ерунда. Существуют другие, более функциональные решения, их только надо найти :-). Например, такой вариант: создание DLL с функциями как в mtapi.dll, но которая будет взаимодействовать не с сервером дилингового центра, а с терминалом на компьютере клиента. В таком случае и интересы фирмы-разработчика будут соблюдены (без терминала МТ 4, DLL работать не сможет) и люди, которые своими руками могут создавать нечто более сложное, чем экспертов на MQL4, получат нормальную возможность интегрировать свой софт (в том числе и со своим gui) с торговой системой. Если такой вариант уже рассматривался и обсуждался, дайте пожалуйста ссылки (я подобного не встречал). Если не рассматривался, хотелось бы узнать мнение разработчиков по этому поводу.

P.S. Строка "возможность использования клиентского API" в рекламе/описании торгового терминала очень привлекательна. Именно это в свое время и привлекло меня к MetaTrader`у, а отсутствие API в 4-ой версии терминала меня очень сильно разочаровало. Хочется надеяться, что разработчики с одной стороны, и желающие пользоваться API с другой стороны все же придут к компромису. Текущее положение дел (вызов функций DLL из экпертов) неудовлетворительно.
 
Вот столкнулся с проблемой, может я конечно и жутко торможу и чего-то не досмотрел.....

есть у меня длл скомпиленая под VC++
есть функция:

void __stdcall process_arr(double *in, double *out, int size);

в эксперте вот такое объявление:
#import "some.dll"
void process_arr(double in[], double& out[], int size);

далее объявлены массивы:

double arr1[100];
double arr2[100];

далее я первый массив инициализирую и передаю оба в функцию
process_arr(arr1,arr2,100);

всё замечательно передаётся, а вот возврящаться как положено не хочет

после возврата из функции вывожу тестовое значение:
Print(arr2[1]);
и в логе появляется запись
2005.09.19 18:30:03 arrtest EURUSD,H1: 2147483647
вообще не в ту степь, при чём здесь 2^31....
точно так же получается с любым другим элементом массива.
хотя под отладчиком перед выходом из функции значения в массиве out такие как должны быть (близкие к цене - ~1.2)
 
Число 2147483647 очень близко к нулю, вроде бы.
Точнее 2^31-1, а это должен быть вроде ноль.
 
void __stdcall process_arr(double *in, double *out, int size);

в эксперте вот такое объявление:
#import "some.dll"
void process_arr(double in[], double& out[], int size);


Просто предположение (потому как с MQL знаком плохо): для второго параметра так ли уж необходим &?
void process_arr(double in[], double& out[], int size);
 
to Rosh, оно то так, но речь идёт о типе дабл, а там представление числа "чуток" другое, и 2^31 довольно далеко от 0 получается.... :(

to VicK, в амперсанде вся суть, благодаря ему я собственно и могу менять содержимое массива...
второй массив - массив с возвращаемыми значениями
 
to VicK, в амперсанде вся суть, благодаря ему я собственно и могу менять содержимое массива...
второй массив - массив с возвращаемыми значениями


В данном случае в амперсанде сути никакой нет (сам только что попробовал), а изменять содержимое массива ты можешь менять благодаря чему-то другому :-). В каталоге samples смотрел пример с DLL? Там все нормально работает. Сделай по аналогии.
 
фигня получается, такое впечатление что амперсанд вообще никакой погоды не делает если мы имеем дело с массивом типа double[]
зато с int[] всё пучком работает, закрадывается у меня подозрение что здесь всё таки начинает попахивать багом.... :(
хотелось бы услышать коментарии разработчиков

если бы это дело с исходниками поставлялось то никто бы голову не морочал, а так... извольте, взываю о помощи
Причина обращения: