Также можеш поискать про связи С програм с Дельфийских DLL-ов
Пытаюсь организовать вызов функций работы с БД (MSSQL) через ADO (в dll) из эксперта -
выдают критическую ошибку при обращении к классу ADOConnection, т. е. работа с базой ну ни как
не хочут строиться. Если кто-нибудь сталкивался с подобными вещами, не откажите в помощи.
Отвечая же вообще, могу посоветовать, для начала, реорганизовать dll-ку в консольное приложение и посмотреть, как оно работает. Если всё нормально, то это однозначно проблемы связи (некорректная организация вызова функций и передачи параметров), т.к. на работу кода внутри dll-ки терминал влиять никак не может.
В продолжение темы по 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)? Разницы при этом нет?
Не получается импортировать 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
Спасибо
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Работоспособность библиотеки проверил на многих других SDK - никогда не запиналась.
При импорте ф-ий из нее в эксперт - выдает критическую ошибку с поледующим закрытием МТ (на стадии тестирования эксперта).
Вопрос: можно ли внедрять сторонние DLL-ки, скажем Delphi-ие и если да, то есть ли какая нибудь особенность не освященная в документации