Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Узнай самые обсуждаемые темы на форуме. Заходи в раздел Стена!
paketa
32
paketa 2008.04.16 17:52 

Мне необходимо организовать связь между 2я dll-ками и терминалом МТ. Из эксперта в МТ вызываются функции 1ой dllки, а та в свою очередь вызывает функуии 2ой dllки. Но даже простая организация такой цепочки (последовательный вызовов функции без параметров сначала из терминала затем из 1ой dllки) выдаёт ошибку 126 (мол неможет загрузить dllку №1). Если из dllки №1 убрать вызов функции dllки №2 то 1ая dllка загружается нормально. Между dll1 и dll2 организовано статическое связывание, работоспособность которого была проверена через специальнонаписанное хостовое приложение, т.е. через хостовое приложение, не являющиеся МТ терминалом, цепочка: exe -> dll1 -> dll2 работает нормально. Ниже привожу исходники простенького примера такой цепочки в результате работы которой выдаёт ошибку 126.


Советник:


#import "pDL.dll"
int DE();
#import

int init()
{
//----
DE();
//----
return(0);
}

int deinit()
{
return(0);
}

int start()
{
return(0);
}
//+------------------------------------------------------------------+


DLL №1


CPPшник:


//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "DL.h"
#include "DL1.h"
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------

int __stdcall DE()
{
return(DE1());
}


.H файл:


extern "C" __stdcall int __declspec(dllexport) DE();


DLL №2


CPPшник:


//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "DL1.h"
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------

int __stdcall DE1()
{
return(777);
}


.H файл:


extern "C" __stdcall int __declspec(dllexport) DE1();




Dllки написаны в Borland C++ Builder v6.0 (build 10.166)

Эксперт запускался в TT v4.0 (build 215)

Dllки ложу в <дериктория терминала>\experts\libraries\


Большая просьба ответить тем кто знает из за чего эта ошибка

Ilnur Iksanov
5362
Ilnur Iksanov 2008.04.16 19:27  
paketa:

...

Эксперт запускался в TT v4.0 (build 215)

Dllки ложу в <дериктория терминала>\experts\libraries\


Большая просьба ответить тем кто знает из за чего эта ошибка


DLL №1 оставляете в <дериктории терминала>\experts\libraries\, а DLL №2, которую вызывает первая, помещаете

в системную папку: C:\Windows\system32\.

Максим
413
Максим 2011.07.26 08:33  
Только что столкнулся с такой проблемой, но записывать в папку C:\Windows\system32\ не позволяют права. Альтернативный выход - положить dll в корневую папку MT4, где находится terminal.exe.
Андрей
1890
Андрей 2011.07.26 09:14  

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

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий