Помогите разобраться в проблеме импорта функции из dll

 

Хочу научиться импортировать функции из 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);
}
//+------------------------------------------------------------------+

Помогите, пожалуйста, подскажите, что я делаю не так?...

Заранее, всем большое спасибо.

 

1 вариант) разберитесь куда всунуть def-файл. Без него вам, скорее всего, ничего не светит.

2 вариант) поставить Visual Studio

 

LOL

вариант 3:

есть тестеры, на худой конец хоть из VB экселя - проверить что запрашиваемая функция вызывается.

Если нет - кривые настройки линкера, да - не ошибка в описании MQL

с установкой MT4 идет хороший си-шный исходник DLL - потренеруйся на нем, кучу времени съэконмит.

 
boysn >>:

#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 так нельзя.

 
Urain >>:

По правилам обьявления функций в 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 точно рабочий? Кто-нибудь проверял его на работоспособность?

Всем спасибо, кто откликнулся и откликнется.

 
а на объявления функций в билдере посмотреть можно? как вы передаете ему строковые параметры и отдаете результат в том же типе? у билдера есть особенности при работе со строками...
 
boysn >>:

{...} 3. А вот насчет def-файла... Конечно, может и из-за него, но, действительно непонятно куда его всунуть. В проектах С++ Builder 6 и 2009 таких файлов нет, с таким расширением, т.е. при сборке самой dll вроде бы его некуда всунуть. В ту же папку под тем же именем в папку \MetaTrader 4\experts\libraries тоже не то... попробовал... Короче, непонятно. Пробовал другой пример, где используется готовая системная dll {...}

Эти функции вызываются.. В чем причина DLLSample непонятно
Если причина в Linker, то что там может быть? Вроде бы делаю так, чтобы файл был автономный.

М..да.. непонятно. А пример в МТ4 точно рабочий? Кто-нибудь проверял его на работоспособность?

Всем спасибо, кто откликнулся и откликнется.

1) несмотря на то, что билдер кхм... "слегка" неправильный, def файл всё равно нужен

2) вы еще не пробовали поставить Visual Studio

3) пример рабочий. не тем строите.

 
jartmailru >>:

1) несмотря на то, что билдер кхм... "слегка" неправильный, def файл всё равно нужен

2) вы еще не пробовали поставить Visual Studio

3) пример рабочий. не тем строите.

я вообще делал дллки для мт4 на дебилдере, деф-файл не пригодился...

 
boysn >>:

Если причина в Linker, то что там может быть? Вроде бы делаю так, чтобы файл был автономный.


можете наскринить вкладки Compiler Linker и Packages настроек проекта?

 
alsu >>:

я вообще делал дллки для мт4 на дебилдере, деф-файл не пригодился...

Поделитесь примером с коллегой :-).

Возможно, там надо написать какую-нибудь закорючку перед объявлением функции.

.

А билдер... у меня до сих пор валяется копия шестёрки с 4-мя сервис паками.

Перестал им пользоваться после забавного случая :-).

Добавляю функцию в .cpp файл - в ответ начинаются разные глюки :-).

Глюки заключались в том, что билдер врал параметры, передаваемые в функцию через стек.

Функцию удаляешь - опять все замечательно.

Ещё можно припомнить глобальные переменные, доступные только из модуля,

в котором они объявлены, а из остальных виден мусор :-).