Отладка прог MetaTrader 4 с помощю Microsoft Visual C++ 2010 Express. - страница 2

 

Как -то много файлов непонятных. Не мучайтесь, создайте новый, чистый dll проект, ему не нужно лежать в МТ папке, например в C:\projects. После его компиляции/линковки в папке с проектом появится файл с расширением .dll. Его перемещаем в <папка терминала>\experts\libraries. Результаты вызова отображаются на вкладках терминала - журнал, эксперты.

P.S: когда разберетесь, можно настроить выходной каталог для проекта, dll сразу будет ложиться туда, очень удобно.

Может пригодится: https://www.mql5.com/ru/articles/18, но это MQL5 есть различия.

 
Приехали. Не могу кнопку старт нажать, ничего не происходит.
 
Вот 2013.12.15 00:34:26 Cannot open file 'C:\Program Files\MetaTrader 4 Admiral Markets\МЕТАТРАЙДЕР\experts\Длильный.ex4'

 
Спасибо!!!!!!!!
 

Да, я частично протупил. #import "MyFirstDLL.dll" было скопировано просто бездумно.

В общем, можно по частям?
1. Препроцессор заменяет строку #include <имя_файла> содержимым файла WinUser32.mqh- это из примера.
И я вот думаю, по логике, что же мне вписать? Это не файл с расширением .cpp нет это должен быть скомпилированный файл но все же нет не .ex4 так как в проэкте визуал студии его нету и быть не может видимо скорее это файл .exe . А файл с расширением .dll это что??? Это в общем другое имя файла .exe?
Стал изучать проект, что бы через свойства папки вписать себе ее правильно и имя, и расширение. И вот, смотрите, я вовсе потерялся, в проекте масса расщирений а такие расширения можно найти тольков папке дебаг моя папка и я короче вовсе растерялся, там обалдеть много всего.


Ух ё, архиватор, прри попытке разбить папку на архив частями, творит невразумительное- создает одну (!!) папку __rar_03.750, она растет 5 минут по обьему, и просто исчезает из компа!!!!!!

2. По ссылке, спасибо, построил проект и внес в него макрос, перестроил, вот, а куда

Правильно оформленная экспортная функции должна иметь следующий вид:

_DLLAPI int __stdcall fnCalculateSpeed(int &res1,double &res2)
  {
   return(0); 

}

экспортная функция эта где должна быть?

 

1. Проект компилируется? Без ошибок? Если да, то установите выходной каталог в известное вам место, ничего искать не придется (описано в статье выше).

2. Вы должны получить файл.dll для импорта его функций в MT. Для импорта функций из него в мета эдиторе пишем:

#import "libname.dll"
   void fn();     // Перечисляем все экспортируемые, необходимые функции

3. dll - не exe, exe запускается руками в ней есть стартовая функция, dll используется другой программой (exe).

4. если решили использовать __stdcall , то есть особенности, даже если напишите extern "C" имя будет изменяться (в таблице экспорта), если не ошибаюсь - будет добавлено @<размер параметров> в конец имени. Либо смотреть имя при помощи различных утилит (например dumpbin), либо поиском через блокнот, либо сделать для проекта .def файл (его пример есть в MT\experts\samples\DLLSample). Мало просто кинуть def файл в папку с проектом (к .h и .cpp файлам) еще нужно отразить это в настройках проекта: свойства проекта/компоновщик/ввод/файл определения модуля.

5. Кое-что писал здесь: https://www.mql5.com/ru/forum/140601/page6

 
Vladimirovits:

...

экспортная функция эта где должна быть?


в .cpp; если объявление функции отдельно (в .h), то реализация в .cpp, а вся мишура (export и т.д.) в .h
 
Если интересны особенности и нюансы функционирования dll и exe, да и вообще всей винды, могу порекомендовать для прочтения: Рихтер "Windows via C/C++"
 
СПАСИБО!!!!!!!!
 
220Volt:

1. Проект компилируется? Без ошибок? Если да, то установите выходной каталог в известное вам место, ничего искать не придется (описано в статье выше).

2. Вы должны получить файл.dll для импорта его функций в MT. Для импорта функций из него в мета эдиторе пишем:

3. dll - не exe, exe запускается руками в ней есть стартовая функция, dll используется другой программой (exe).

4. если решили использовать __stdcall , то есть особенности, даже если напишите extern "C" имя будет изменяться (в таблице экспорта), если не ошибаюсь - будет добавлено @<размер параметров> в конец имени. Либо смотреть имя при помощи различных утилит (например dumpbin), либо поиском через блокнот, либо сделать для проекта .def файл (его пример есть в MT\experts\samples\DLLSample). Мало просто кинуть def файл в папку с проектом (к .h и .cpp файлам) еще нужно отразить это в настройках проекта: свойства проекта/компоновщик/ввод/файл определения модуля.

5. Кое-что писал здесь: https://www.mql5.com/ru/forum/140601/page6

В новом метаэдиторе (билды >= 529) есть любопытный сервис: если DLL находится в MQL-песочнице (видна в метаэдиторе), то достаточно взять её мышкой из навигатора и бросить в окно с текстом программы, чтоб получить список имён готовый к импортированию. Примерно в таком виде:

#import "..\libraries\SoftFX.OneClickTrading.dll"
// Command_GetDouble
// Command_GetInt
// Command_GetString
// Command_GetType
// Command_SetDouble
// Command_SetInt
// Command_SetString
// FdkCreate
// FdkDelete
........  // продолжение списка
.....
...
#import

Параметры, правда, не указываются, но зато с именами после этого проблем не возникает.

--

p.s. только что выяснил, что кидать dll-ку в окно редактора можно и прямо из проводника. эффект тот же.

Причина обращения: