Как на счет импорта DLL?

 
Написал довольно простую DLL на Delphi-ях, экспортирующую 2 ф-ии.
Работоспособность библиотеки проверил на многих других SDK - никогда не запиналась.
При импорте ф-ий из нее в эксперт - выдает критическую ошибку с поледующим закрытием МТ (на стадии тестирования эксперта).

Вопрос: можно ли внедрять сторонние DLL-ки, скажем Delphi-ие и если да, то есть ли какая нибудь особенность не освященная в документации
 
Все экспортируемые из DLL функции должны быть описаны как stdcall (сишный вид), чтобы МетаТрейдер мог их правильно вызывать. Терминал использует только stdcall оформление.
 
Спасибо, - совет помог. А как обстоят дела с экспортом в dll-ку строковых параметров? Я слышал ShareMem там запрещен, а без этой библиотеки строки передаются очень криво
 
Передавай через PChar - потом в своем DLL-е можеш присвоить передаваемое к обычной локально объявленый стринг.
Также можеш поискать про связи С програм с Дельфийских DLL-ов
 
В продолжение темы по DLL хочу задать вопрос:

Пытаюсь организовать вызов функций работы с БД (MSSQL) через ADO (в dll) из эксперта -
выдают критическую ошибку при обращении к классу ADOConnection, т. е. работа с базой ну ни как
не хочут строиться. Если кто-нибудь сталкивался с подобными вещами, не откажите в помощи.
 
Уважаемый, если Вы хотите, чтобы Вам кто-то оказал конкретную помощь в конкретной проблеме, нужно приводить конкретный код, в котором эти проблемы возникают... Задавая обшие вопросы, Вы рискуете получать общие же ответы, т.к. никому не нужно гадать, что именно у Вас там не получается...
Отвечая же вообще, могу посоветовать, для начала, реорганизовать dll-ку в консольное приложение и посмотреть, как оно работает. Если всё нормально, то это однозначно проблемы связи (некорректная организация вызова функций и передачи параметров), т.к. на работу кода внутри dll-ки терминал влиять никак не может.
 
faust:
В продолжение темы по DLL хочу задать вопрос:

Пытаюсь организовать вызов функций работы с БД (MSSQL) через ADO (в dll) из эксперта -
выдают критическую ошибку при обращении к классу ADOConnection, т. е. работа с базой ну ни как
не хочут строиться. Если кто-нибудь сталкивался с подобными вещами, не откажите в помощи.
Как раз конкретный вопрос и задают!

А вот и ответ ;-)

Нужно добавить в uses модуль ActiveX. Потом при инициализации DLL-a (begin..end.) нужно вызвать CoInitialize(nil);
При deinit эксперта нужно вызвать спец. сделаную функцию Finish, где вызывается CoUninitialize

Вот тебе и примерчик:
library ADODLL; uses SysUtils, Classes, Windows, ActiveX, //а вот это нужно! frmDataU in 'frmDataU.pas' {dmMain: TDataModule}; {$R *.res} procedure GetData(Currency: PChar; Bid: Double);stdcall; begin //.. Тут делаем что-то end; procedure Finish;stdcall; begin dmMain.Free; CoUninitialize end; exports GetData, Finish; begin CoInitialize(nil); dmMain:=TdmMain.Create(nil) end.


У меня работает.
 
Огромное спасибо Itso за помощь, еще правда не пробовал, но мысль ясна с ActiveX. Надо полагать динамически экземпляры классов ADOConnection и т.д. можно не создавать, а просто использовать компоненты в модуле данных (как у Вас - dmMain)? Разницы при этом нет?
 
faust:
Огромное спасибо Itso за помощь, еще правда не пробовал, но мысль ясна с ActiveX. Надо полагать динамически экземпляры классов ADOConnection и т.д. можно не создавать, а просто использовать компоненты в модуле данных (как у Вас - dmMain)? Разницы при этом нет?
Разница толлько в том, что при использование Data Module можно проверить все еще во время дизайна. Все намного упрощается.
 

Не получается импортировать DLL. (((

В MS Visual C++ написал DLL:

//MyDll.h

#define MY_EXPORT extern "C" __declspec ( dllexport )
MY_EXPORT int CALLBACK Return1();

//MyDll.cpp

MY_EXPORT int CALLBACK Return1() { return 1; }

//MyDll.def

LIBRARY "MyDll"

EXPORTS Return1 @1

После компиляции получил MyDll.dll и MyDll.lib

Также написал микро прогу на C++ использующую DLL. В настройках проекта указал MyDll.lib. Она нормально работает с DLL.

Далее попробовал импорт DLL из MT4, положив в директорию experts\libraries файл MyDll.dll. В документации ничего про *.lib я не нашел поэтому его не клал.
//ImportDll.mqh (в директории experts\include)
#import "MyDll.dll"

int Return1();

//ImportDll.mq4 (в директории experts\indicators)
#include <ImportDll.mqh>
int init()

{

Print("Return1="+Return1());

return (0);
}

При запуске ImportDll.ex4 пришет: dll calls are not allowed; 'MyDll.dll' - 'Return1'
ПОМОГИТЕ .... я уже мосх сломал ((((((((((((((((((((((((( Мой ICQ: 573794562, e-mail: AKalashnikov84@mail.ru.

 

Здравствуйте

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

Спасибо