delphi dll + mt4 + новый билд

 

помогите кто может ..

в delphi 7 dll процедура..

procedure test1(var data: array of Double); stdcall;
begin
ShowMessage('Вошли ');

end;

в mt4 :

#import "gayss.dll"
void test1( double &data[] );
#import

ArrayResize(data, 6);
data[0]= 2;
data[1]= 4;
data[2]= 8;
data[3]= 16;
data[4]= 21;

data[5]= 3;

test1(data);

и ошибка вылазит.. 2014.02.06 17:39:04.241 stack damaged, check DLL function call in 'SOG_2014.mq4' (80,7)

может кто знает как надо по правильному..
 

нашел как обращаться к динамическому массиву .. и как с ним работать в dll .. если кому интересно опишу..

столкнулся с другой проблемой.. при обращении к dll в первый раз все нормально.. но вот во второй (при работающей программе) . или закрываю терминал .. то виснет терминал и процессор грузит на все.. кто знает подскажите.. я понимаю что язык программирования уже mt5 но.. я писал у них на сайте они меня отправили сюды...

 
vlad6k:

нашел как обращаться к динамическому массиву .. и как с ним работать в dll .. если кому интересно опишу..

ага. давайте, пригодится.

я как-то писал dll-ку на Делфи для MT4 (года 4 назад), но эт было давно и тонкостей не помню.

столкнулся с другой проблемой.. при обращении к dll в первый раз все нормально.. но вот во второй (при работающей программе) . или закрываю терминал .. то виснет терминал и процессор грузит на все.. кто знает подскажите.. я понимаю что язык программирования уже mt5 но.. я писал у них на сайте они меня отправили сюды...

напишите разработчикам. // на пятом форуме в профиле слева ссылка "Сервисдеск". если нет профиля на mql5.com - заведите.

желательно с чёткими примерами кода.

 
vlad6k:

нашел как обращаться к динамическому массиву .. и как с ним работать в dll .. если кому интересно опишу..

Я могу ошибаться, но работать через array of... неправильно, надо работать непосредственно с указателями.
 
ага. давайте, пригодится.

все неописываю.. кто пишет поймет.. на delphi 7

type
Tarray1= array[0..0] of Double;
PTarray1= ^Tarray1;
procedure test1(
name: PWideChar;// имя .. любой string
data_k: Integer;// размер массива data // обязательно!!
data: PTarray1
); stdcall;
var
q1: Integer;
begin
for q1:= 0 to 5 do begin
ShowMessage(IntToStr(q1)+ ' = '+ FloatToStr(data^[q1]));
end;
end;


я как-то писал dll-ку на Делфи для MT4 (года 4 назад), но эт было давно и тонкостей не помню.

мне нравиться dll .. пишу нейронку думаю без dll никуда.. и скорость вроде выше чем в mt4

на mt4

#import "gayss.dll"
void test1(string name,
int kol_razm,
int data_k,
double &data[] // входные данные
);

#import
double data[];.
#import
int start(){
ArrayResize(data, 2);
data[0]= 2;
data[1]= 3;
test1("name", ArraySize(data), data);
}
 
После первого вызова, терминал будет удерживать ДЛЛку под собой, до его закрытия. Проверьте этот момент.
 
вот я и ищу как рубануть удержание.. ничего непомогает
 
А зачем отрубать удержание?
 
FAQ:
После первого вызова, терминал будет удерживать ДЛЛку под собой, до его закрытия. Проверьте этот момент.

Можно принудить ось выгружать неиспользуемые dll. Если это очень нужно.

 
дело не в оси, дело в терминале. так как он будет парентом для либки, и будет удерживать ее до окончания сессии. либка выгрузиться по окончании работы вызывающего процесса (советник\скрипт\индикатор) - надо просто исходить из этого факта при ее использовании .
 

пожалуйста не говорите космическим языком.. как я могу в терминале сделать выгрузку dll .. пример кода.. пожалуйста..

еще вопрос .. если на одном графике работает сова с dll и на второй график кинуть сову с dll .. они нормально будут работать?

Причина обращения: