Вопрос по DLL ...... - страница 6

 
Кстати, хорошая штука http://www.parashift.com/c++-faq-lite/index.html.
 
Для автора вопрос еще актуален? Пишу для себя dll, могу небольшой примерчик набросать.
 
Да актуален !!! С длл я разобрался благодаря вам ! Спасибо ! Но есть вещи которые я ни как не могу понять как их заложить в длл
 

1. Функции вызываются по определенным правилам - Calling convention. MT4 гарантировано работает с функциями, которые придерживаются __stdcall (частный случай разновидности правил). Для уверенности в том, что экспортируемая функция использует вышеупомянутые правила, она должна выглядеть следующим образом: void __stdcall AnyFn();

2. Я знаю два способа заставить библиотечную функцию экспортироваться – при помощи __declspec(dllexport) и при помощи def файла (это проще, иначе вдобавок придется бороться с декорированием функций). В VS для включения def файла в проект, сначала добавить к файлам проекта, затем добавить имя файла в: свойства проекта/компоновщик/ввод/файл определения модуля.

P.S: Пример проекта с def файлом находятся в: каталог терминала\ experts\samples\DLLSample.



 

ПЕРЕДАЧА ПАРАМЕТРОВ В DLL ФУНКЦИЮ

1. При передачи string переменной, в DLL передается массив из char (ANSI символ, занимает 1 байт).

#import "myLib.dll"

void fn(string var);

#import

DLL:

void __stdcall fn(char *pointer) {}


2. Передача int или double в библиотеку приведет к копированию переменной, следовательно при изменении переменной в dll не происходит изменение в МКЛ:

#import "myLib.dll"

void fn(int var);

void fn(double var);

#import

DLL:

void __stdcall fn(int var) {}


3. Для наличия возможности изменения переменных int и double, объявленных в MQL, следует передавать массивы:

#import "myLib.dll"

void fn(int var[]);

void fn(double var[]);

#import

DLL:

void __stdcall fn(int *var) {}

void __stdcall fn(double *var) {}


4. При передачи массива из string, в DLL передается структура struct MqlStr:

МКЛ прототип:

#import "myLib.dll"

void fn(string var[]);

#import

DLL:
struct MqlStr
{
   int len;
   char *string;
};

void __stdcall fn(MqlStr *var) {}


P.S.

Всякий раз, когда в ДЛЛ передаются массив или строка (string), то в фактически отсылается указатель на участок памяти (указатель), в библиотеке его принимаем следующем образом:

void __stdcall fn(int *pointer) {} // так. Так можно работать как с массивом, например, pointer[4] = 4.

void __stdcall fn(int &reference) {} // или так. Но получим доступ только к одному элементу. Актуально при передачи в библиотеку массива из одного элемента.

 
#import "myLib.dll"

void fn(string var);

#import

DLL:

void __stdcall fn(char *pointer) {}

Не смог найти толкового объяснения знаку * перед pointer, зачем он нужен ??? Разве без него нельзя ????

И вопрос по ходу как из длл получить текст ???

 
VOLDEMAR:

Не смог найти толкового объяснения знаку * перед pointer, зачем он нужен ??? Разве без него нельзя ????

И вопрос по ходу как из длл получить текст ???

Не стоит вам из неё текст получать. По крайней мере в этом году.
 

1. Передача строки в МКЛ:

DLL:
#include <string.h>
void __stdcall Temp(char *mqlStr)
{
   size_t mqlStringSize = strlen(mqlStr);
   char stroka[] = "DLL string";          // Эту строку передадим в MQL.
   if(strlen(stroka) > mqlStringSize)
      stroka[mqlStringSize] = '\0';       // Добавляем нуль-терминатор (обозначает конец строки).
   strcpy(mqlStr, stroka);
   return;
}

MQL:
#include "WaveCounter.dll"
void Temp(string str);
#include
int start()
{ 
   string str = "wwwwwsff";    // Задаем длину строки; Если длина будет меньше необходимого, то строка будет урезана.
   Temp(str); 
   Alert(str); 
   return;
} 
2. Знак * говорит о том, что это указатель. Если коротко, то у любой переменной есть не только какое-то значение, но и адрес по которому она расположена в памяти. Указатели могут работать с этим адресом. Этот вопрос необходимо хорошо понимать, думаю стоит обратить внимание на книги по C++;
 
220Volt:

1. Передача строки в МКЛ:

2. Знак * говорит о том, что это указатель. Если коротко, то у любой переменной есть не только какое-то значение, но и адрес по которому она расположена в памяти. Указатели могут работать с этим адресом. Этот вопрос необходимо хорошо понимать, думаю стоит обратить внимание на книги по C++;
да я как раз этим занимаюсь . Юзаю С++, смотрю видео, читаю книги. Теперь многое из МКЛ 5 становится понятным .......
 

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

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