Скачать MetaTrader 5

Проблема импорта DLL с символом @ в имени функции.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Храни исходные коды в MQL5 Storage. Это безопасно!
trustno1_1983
31
trustno1_1983 2012.07.12 12:39 

Добрый день!

Помогите пожалуйста решить следующую проблему.

Есть DLL в ней есть некоторый набор функций. Функции содержат в имени символ @.

Например _ex_calc_d@12 или _ex_calc_h@8.

В MT4 следующий код компилируется без проблем:

#import "mydll.dll"

double _ex_calc_d@12(int d);
double _ex_calc_h@8(int h);
      
#import

 

В MT5 при компиляции этого кода я получаю следующую ошибку:

'@' - unknown symbol mydll.mqh

'12' - semicolon expected mydll.mqh

Что делать?

С уважением, Артем.

220Volt
1175
220Volt 2012.07.12 13:06  

Все дело в декорировании, MT4 его не понимал, поэтому необходимо было писать так. Попробуйте в МЕ:

#import "mydll.dll"

double ex_calc_d(int d);  //Задача - написать так же как и ДЛЛ
double ex_calc_h(int h);
      
#import

Если не поможет, то отключите декорирование имени в DLL.

Статья по теме: https://www.mql5.com/ru/articles/18

Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?
Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?
  • 2010.01.27
  • MetaQuotes Software Corp.
  • www.mql5.com
Так уж сложилось, что сейчас мало кто из разработчиков помнит, как написать простую DLL библиотеку и в чем особенности связывания разнородных систем. Я постараюсь за 10 минут на примерах продемонстрировать весь процесс создания простых DLL библиотек и раскрою некоторые технические детали нашей реализации связывания. Покажу пошаговый процесс создания DLL библиотеки в Visual Studio с примерами передачи разных типов переменных (числа, массивы, строки и т.д.) и защиту клиентского терминала от падений в пользовательских DLL.
Nikolay Demko
12465
Nikolay Demko 2012.07.12 13:07  
trustno1_1983:
... Что делать?
Не использовать @ в именах функций (если это ваша dll).
trustno1_1983
31
trustno1_1983 2012.07.12 13:11  

>>220 Volt

Вопрос снят, спасибо за статью. Помогло. 

Nikolay Demko
12465
Nikolay Demko 2012.07.12 13:14  
trustno1_1983:

>>220Volt

Пробовал так, тогда компиляция проходит, но потом ругается сам терминал что не может найти имя такой функции (без @).

>>Urain

Если бы DLL была написана мной, я бы и не использовал @, но она стороняя.

Тогда в Сервисдеск, это баг на уровне компилятора.
220Volt
1175
220Volt 2012.07.12 13:14  
trustno1_1983:

>>220Volt

Пробовал так, тогда компиляция проходит, но потом ругается сам терминал что не может найти имя такой функции (без @).

>>Urain

Если бы DLL была написана мной, я бы и не использовал @, но она стороняя.

Еще так:

#import "mydll.dll"

double _ex_calc_d(int d);  //Задача - написать так же как и ДЛЛ
double _ex_calc_h(int h);
      
#import
Комбинатор
15926
Комбинатор 2012.07.12 13:14  

Использовать __cdecl?

Или попробовать просто убрать декорации, как уже советовали.

trustno1_1983
31
trustno1_1983 2012.07.12 13:18  
Не, ребят, все работает тип топ. Просто надо сделать как предложил 220Volt. 
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий