1 вариант) разберитесь куда всунуть def-файл. Без него вам, скорее всего, ничего не светит.
2 вариант) поставить Visual Studio
LOL
вариант 3:
есть тестеры, на худой конец хоть из VB экселя - проверить что запрашиваемая функция вызывается.
Если нет - кривые настройки линкера, да - не ошибка в описании MQL
с установкой MT4 идет хороший си-шный исходник DLL - потренеруйся на нем, кучу времени съэконмит.
#import "PExpDll.dll"
int GetIntValue(int);
double GetDoubleValue(double);
string GetStringValue(string);
#import
По правилам обьявления функций в MQL-4 у вас явная ошибка:
int GetIntValue(int X); double GetDoubleValue(double X); string GetStringValue(string X);
нет имени входного параметра, а только тип. В MQL-4 так нельзя.
По правилам обьявления функций в MQL-4 у вас явная ошибка:
нет имени входного параметра, а только тип. В MQL-4 так нельзя.
То, на что не ругается компилятор - то - можно.
Попробовал написать так:
#import "timeService.dll" // функция, выдающее смещение от Utc // до времени сервера и до локального времени int timeService( string , // <--- убрал имя переменной int & utcToServer[], int & utcToLocal[] ); #import
Все прекрасно работает.
Собственно, по канонам языка Си и Си++, указывать названия параметров совершенно необязательно -
более того, в большинстве случаев программист занят тем, что сидит и их комментирует.
Большое спасибо за советы, спасибо, что откликнулись.
1. В МТ4 у меня стоит галочка Сервис-Настройки-Советники-Подтверждать вызов функций dll. Поэтому когда запускаю скрипт, то он у меня спрашивает, вызывать ли такую функцию...? Выбираю "Да" и следом идет ошибка: cannot call function from dll (error 127).
2. По поводу объявлений функций без параметра типа double GetDoubleValue(double), то это так написано в примерах, тем более, что компилятор не ругается на это, значит это нормально.
3. А вот насчет def-файла... Конечно, может и из-за него, но, действительно непонятно куда его всунуть. В проектах С++ Builder 6 и 2009 таких файлов нет, с таким расширением, т.е. при сборке самой dll вроде бы его некуда всунуть. В ту же папку под тем же именем в папку \MetaTrader 4\experts\libraries тоже не то... попробовал... Короче, непонятно. Пробовал другой пример, где используется готовая системная dll
#import "kernel32.dll"
int _lopen (string path, int of);
int _lcreat (string path, int attrib);
int _llseek (int handle, int offset, int origin);
int _lread (int handle, string buffer, int bytes);
int _lwrite (int handle, string buffer, int bytes);
int _lclose (int handle);
#import
Эти функции вызываются.. В чем причина DLLSample непонятно
Если причина в Linker, то что там может быть? Вроде бы делаю так, чтобы файл был автономный.
М..да.. непонятно. А пример в МТ4 точно рабочий? Кто-нибудь проверял его на работоспособность?
Всем спасибо, кто откликнулся и откликнется.
{...} 3. А вот насчет def-файла... Конечно, может и из-за него, но, действительно непонятно куда его всунуть. В проектах С++ Builder 6 и 2009 таких файлов нет, с таким расширением, т.е. при сборке самой dll вроде бы его некуда всунуть. В ту же папку под тем же именем в папку \MetaTrader 4\experts\libraries тоже не то... попробовал... Короче, непонятно. Пробовал другой пример, где используется готовая системная dll {...}
Эти функции вызываются.. В чем причина DLLSample непонятно
Если причина в Linker, то что там может быть? Вроде бы делаю так, чтобы файл был автономный.
М..да.. непонятно. А пример в МТ4 точно рабочий? Кто-нибудь проверял его на работоспособность?
Всем спасибо, кто откликнулся и откликнется.
1) несмотря на то, что билдер кхм... "слегка" неправильный, def файл всё равно нужен
2) вы еще не пробовали поставить Visual Studio
3) пример рабочий. не тем строите.
Поделитесь примером с коллегой :-).
Возможно, там надо написать какую-нибудь закорючку перед объявлением функции.
.
А билдер... у меня до сих пор валяется копия шестёрки с 4-мя сервис паками.
Перестал им пользоваться после забавного случая :-).
Добавляю функцию в .cpp файл - в ответ начинаются разные глюки :-).
Глюки заключались в том, что билдер врал параметры, передаваемые в функцию через стек.
Функцию удаляешь - опять все замечательно.
Ещё можно припомнить глобальные переменные, доступные только из модуля,
в котором они объявлены, а из остальных виден мусор :-).
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Хочу научиться импортировать функции из dll. Пробовал разные варианты, но постоянно появляется ошибка: cannot call function from dll (error 127).
1. Пробовал скомпилировать свой проект в С++ Builder 6
2. Тот же проект в С++ Builder 2009
3. Создал проект из примера DLLSample в С++ Builder 2009, скомпилировал
Везде один и тот же результат: cannot call function from dll (error 127).
Для проверки использую скрипт, в котором PExpDll.dll - скомпилированная библиотека в С++ Builder 2009 из примера DLLSample, которая поставляется с MetaTrader 4.
Вот этот скрипт:
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net//"
#import "PExpDll.dll"
int GetIntValue(int);
double GetDoubleValue(double);
string GetStringValue(string);
#import
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
//----
Print("Начало скрипта");
GetStringValue("Интересно, будет ли это работать?");
GetIntValue(10);
//----
return(0);
}
//+------------------------------------------------------------------+
Помогите, пожалуйста, подскажите, что я делаю не так?...
Заранее, всем большое спасибо.