создание базовой dll в metatrader4

Я пытаюсь создать базовую dll hello world, используя кодовые блоки и metatrader4, и пытаюсь сделать это в полосатой версии. моя компиляция .dll и .def находится в том же каталоге, что и файл .mq4.

в файле test.mq4

#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict

//#import "gimmeDLL.dll"
//   string GetStringValue(string) define;
//#import

#import "gimmeDLL.dll"
    string GetStringValue(string) define;
#import

void OnStart()
  {
   GetStringValue();

  }

в main.cpp dll

#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

#define MT4_EXPFUNC __declspec(dllexport)

void MT4_EXPFUNC GetStringValue()
  {
   cout << "Hello, World" << endl;
  }

в gimmeDLL.def у меня есть

LIBRARY gimmeDLL

EXPORTS
    GetStringValue

ошибка

'define' - semicolon expected   marketDump.mq4  6   34
'define' - declaration without type marketDump.mq4  6   34
'GetStringValue' - wrong parameters count   marketDump.mq4  11  4

person Community    schedule 25.07.2014    source источник
comment
Примечание. Я не пытаюсь создать индикатор. Никакие «индикаторы» мне не помогут. Я ищу необработанную связь с dll и ничего больше.   -  person    schedule 26.07.2014
comment
Хотя это может звучать как провокация, для экспресс-теста СКРИПТ является лучшей оболочкой MQL4 для вашей цели, чем советник, потому что в HelloWorld, обернутом советником, вы полагаетесь на A) ВХОД В MT4 /Server (на Брокерском счете) + B) РАБОТАЕТ в ПН/ПТ в рабочее время MarketHours + C) ТЕРПЕНИЕ, чтобы дождаться, пока рынок FX отправит событие StreamQuote, чтобы MT4/терминал обработал вашу строку кода.. ................................................. ................**См. ниже для другого ответа на How-To **   -  person user3666197    schedule 11.08.2014


Ответы (2)


Скомпилируйте это как СКРИПТ, чтобы избежать зависимостей от EA

Для экспресс-теста SCRIPT — гораздо лучшая MQL4-«обертка» для вашей цели, чем советник, потому что в HelloWorld, обернутом советником, вы полагаетесь на

A) ВХОДЯЩИЙ на MT4/сервер (на существующем + действующем счете брокера)

+

Б) РАБОТАЕТ в ПН/ПТ MarketHours

+

C) ПРОЯВЛЯТЬ ТЕРПЕНИЕ и ждать, пока следующее событие на валютном рынке не отправит хотя бы одно событие StreamQuote,

чтобы ваш ‹localhost> MT4/Terminal обрабатывал вашу единственную строку кода...

Итак, "КАК"?

#import "gimmeDLL.dll"                       // MQL4-import-section-start-marker--------
    string GetStringValue();                 //      interface definition for compile-time processing
#import                                      // MQL4-import-section-end-marker----------
void   OnInit() {                            // MQL4-on-init(), for pre-Build-578 Terminal, use rather int init(){ ...; return(0); } <code-constructor>
       Comment( "DLL-call test",             // MQL4-UI-printing facility
                "\nhas produced a string == [[[",
                GetStringValue(),
                "]]]"
              );
       }
person user3666197    schedule 11.08.2014

Вам нужно объявить список функций, которые вы будете использовать следующим образом:

> #import "file_name"
>     func1 define;
>     func2 define;
>     ...
>     funcN define;
> #import

Взгляните на это: http://docs.mql4.com/basis/preprosessor/import

person Dmitry    schedule 26.07.2014
comment
У вас синтаксическая ошибка. вы должны закрыть блок #import file_name оператором #import. Посмотрите на последнюю строку выше, а также в документе выше. Кроме того, удалите слово define из оператора импорта, оставив только void HelloWorld();. - person Dmitry; 27.07.2014
comment
#import gimmeDLL.dll string GetStringValue(string) определить; #import ‹- вы имеете в виду закрыть его этим ?? по-прежнему возникают ошибки, я отредактировал код, чтобы представить изменения с момента добавления вашего предложения. - person ; 28.07.2014
comment
Я позаимствовал из примера кода DLL. Я могу заставить работать пример кода, но он не похож на «Hello World». Не уверен, что я делаю неправильно. - person ; 28.07.2014
comment
Да, вам нужно закрыть раздел с помощью #import, а также удалить слово define из: #import gimmeDLL.dll string GetStringValue(string) define; #импорт - person Dmitry; 28.07.2014
comment
удалить определение из ~? В вашем определении «func1 define» есть слово «define», как и в моем коде выше. Я скопировал/вставил туда ваш код ^^, содержащий 2 дополнительных «строковых» выражения, и получил точно такую ​​же строку ошибки GetStringValue(string) define; - person ; 28.07.2014
comment
Я понял. Я понятия не имею, почему они имеют «определение» в определении функции, но вы должны удалить его, чтобы использовать его. чертов st00pid. Но спасибо, теперь компилируется. - person ; 28.07.2014
comment
Несмотря на то, что компиляция языка MQL4 немного изменилась после введения в сборку 572+ языка a-New-MQL4, #import "aDll.dll" / { определения синтаксиса функций } / < b>#import MetaLang.exe-директива препроцессора компилятора не изменилась. Вышеупомянутые пробы/ошибки были ИМХО скорее артефактами копирования/вставки, ни один настоящий MQL4-программист никогда не столкнется с таким неверным представлением ни на одном из этапов разработки/тестирования/производства. - person user3666197; 14.08.2014