Вверх ↑
Этот топик читают: Гость
Ответов: 176
Рейтинг: 12
#1: 2011-08-03 21:24:15 ЛС | профиль | цитата
Можно ли вызывать функцию из dll, созданной в HiAsm, в любом другом языке? Например в mql4. Или эти Dll только для HiAsm?

Я пробовал так. Создал DLL в HiAsm


Add(DLL,2953706,343,119)
{
WorkPoints=#3:asd|
EventPoints=#7:GoMyDll|
link(GoMyDll,6656957:doData,[])
}
Add(DoData,6656957,392,119)
{
Data=String(Hello from DLL!)
link(onEventData,2953706:asd,[(436,125)(436,113)(331,113)(331,125)])
}


Потом попытался вызвать функцию из этой dll в программе на языке mql4. Делается это там вот так:



#import "MyDll.dll" // добавляем dll
string GoMyDll(); // указываем какую функцию импортировать
#import


int init()
{
Comment(GoMyDll()); // пробуем вызвать импортируемую функцию из dll.
return(0);
}


int start()
{
return(0);
}


Для того, чтобы запустить этот код, дужно скачать терминал MT4 http://nordfx.com/download/1312388140/nfx4setup.exe
1. Устанавливаем терминал
2. Ложим, созданную в HiAsm dll в папку ...MetaTraderexpertslibraries. Имя dll должно быть такое MyDll.dll
3. Запускаем ...MetaTraderMetaEditor.exe
4. Нажимаем кнопку "создать", выбираем "советник", жмём "далее", вводим любое имя, жмём "готово"
5. Копируем второй код в созданный советник.
6. Нажимаем "компилировать"

Если в процессе компиляции ошибок нет, значит идём дальше.

1. Запускаем ...MetaTrader erminal.exe
2. Открываем демо счёт
3. Слева будет окошко "обзор рынка". Жмём правой кнопкой на любую строчку. К примеру EURUSD. И выбираем "окно графика" и разворачиваем на всё рабочее пространство
4. Внизу, слева есть окошечко "навигатор". Выбираем в нём созданный в предыдущей инструкции советник и тянем его на график.
5. В открывшемся окне отмечаем галочками "Разрешить импорт функций из DLL". Жмём Ок.

По идее программа должна импортировать функцию GoMyDll из нашей dll. И эта функция должна вернуть такой текст Hello from DLL! Этот текст должен появиться в левом верхнем углу графика. Но этого не происходит.

Про импорт функций из dll в mql4:
Импорт функций осуществляется из откомпилированных модулей MQL4 (файлы *.ex4) и из модулей операционной системы (файлы *.dll). Имя модуля указывается в директиве #import. Для того, чтобы компилятор мог правильно оформить вызов импортируемой функции и организовать правильную передачу параметров, необходимо полное описание функций. Описания функций следуют непосредственно за директивой #import "имя модуля". Новая команда #import (можно без параметров) завершает блок описания импортируемых функций.


#import "имя_файла"
func1 define;
func2 define;
...
funcN define;
#import


Импортируемые функции должны иметь уникальные имена. Нельзя одновременно импортировать из разных модулей функции с одинаковыми именами. Импортируемые функции не должны иметь имен, совпадающих с именами встроенных функций.

Так как импортируемые функции находятся вне компилируемого модуля, компилятор не может проверить правильность передаваемых параметров. Поэтому, во избежание ошибок выполнения, необходимо точно описывать состав и порядок параметров, передаваемых в импортируемые функции. Параметры, передаваемые в импортируемые функции (как из EX4, так и из DLL-модулей), не могут иметь значения по умолчанию.

Примеры:


#import "user32.dll"
int MessageBoxA(int hWnd, string lpText, string lpCaption, int uType);
#import "stdlib.ex4"
string ErrorDescription(int error_code);
int RGB(int red_value, int green_value, int blue_value);
bool CompareDoubles(double number1, double number2);
string DoubleToStrMorePrecision(double number, int precision);
string IntegerToHexString(int integer_number);
#import "ExpertSample.dll"
int GetIntValue(int);
double GetDoubleValue(double);
string GetStringValue(string);
double GetArrayItemValue(double arr[], int, int);
bool SetArrayItemValue(double& arr[], int,int, double);
double GetRatesItemValue(double rates[][6], int, int, int);
int SortStringArray(string& arr[], int);
int ProcessStringArray(string& arr[], int);
#import


Для импорта функций во время выполнения mql4-программы используется так называемое позднее связывание. Это значит, что пока не вызвана импортируемая функция, соответствующий модуль (ex4 или dll) не загружается.

Не рекомендуется использовать полностью квалифицированное имя загружаемого модуля вида DriveirectoryFileName.Ext. Библиотеки MQL4 загружаются из папки terminal_direxpertslibraries. Если библиотека не была найдена, то производится попытка загрузить библиотеку из папки terminal_direxperts.
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 5446
Рейтинг: 323
#2: 2011-08-03 22:00:01 ЛС | профиль | цитата
toropchin, можно. Нужно только изучить код компонентов среды и код генерируемой DLL.
карма: 1

0
Ответов: 176
Рейтинг: 12
#3: 2011-08-03 22:05:40 ЛС | профиль | цитата
Я так думаю, что имена функций, которыми наполняется dll совсем не такие, как имена точек EventPoints компонента:

Add(DLL,2953706,287,91)
{
}
Или я не прав?
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 5446
Рейтинг: 323
#4: 2011-08-03 22:10:24 ЛС | профиль | цитата
toropchin, прав. Ответы на многие вопросы есть в кодах компонентах UseHiDLL, CallDLL, DynamicHiDLL.
карма: 1

0
Ответов: 176
Рейтинг: 12
#5: 2011-08-03 22:30:44 ЛС | профиль | цитата
Самое интересное, что ума не хватает найти ответы в коде этих компонентов. Вот, что выдал просмотрщик TotalCommander после нажатия F3 на созданной dll
123hydkhhf.jpg
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
файлы: 1123hydkhhf.jpg [67.6KB] [442]
Ответов: 5446
Рейтинг: 323
#6: 2011-08-03 23:50:17 ЛС | профиль | цитата
toropchin, вся работа с такой DLL ведётся через функции _hi_doWork и _hi_getVar. Плюс при загрузке DLL её надо "проинициализировать", вызвав _hi_DllInit. Всё это чёрным по белому написано в hiUseHiDll.pas, вместе с параметрами вызова. Описание типа TData есть в share.pas
------------ Дoбавленo в 23.50:
Короче говоря, использовать HiAsm-овские DLL вне HiAsm практически невозможно.
карма: 1

0
Ответов: 176
Рейтинг: 12
#7: 2011-08-04 07:28:47 ЛС | профиль | цитата
iarspider писал(а):
Короче говоря, использовать HiAsm-овские DLL вне HiAsm практически невозможно.

Да уж...
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Разработчик
Ответов: 4698
Рейтинг: 426
#8: 2011-08-04 12:51:24 ЛС | профиль | цитата
iarspider писал(а):
Короче говоря, использовать HiAsm-овские DLL вне HiAsm практически невозможно.

Поправлю: использовать DLL пакета Windows HiAsm-а вне HiAsm практически невозможно. В пакете Lazarus как он будет готов, возможно, все станет намного проще.
карма: 10
0
8
Сообщение
...
Прикрепленные файлы
(файлы не залиты)