Нужна помощь!!! Не получается передать строку через DLL, во внешнюю программу. - страница 2

 

Вот Вам Делфи-код для передачи в dll вещественного числа, отброса дробной части и возврата целочисленной части числа. Это не строковые параметры, но код вполне работает и терминал с ним дружит. Посмотрите, мож что-то увидите в нём для себя.

library basic;

uses
  SysUtils,
  Windows,
  Classes;

{$R *.res}

// --------- Отброс дробной части ---------
function OtbrosDrobnChasti(ext_DobleVar:Double):Integer; stdcall;
  // Функция Int возвращает целочисленную часть числа с плавающей точкой, как
  // число с плавающей точкой.
  // Функция Trunc делает то же самое, но возвращает целое число в формате Integer.

  begin
    DecimalSeparator:='.';
    OtbrosDrobnChasti:=Trunc(ext_DobleVar);
  end;

exports OtbrosDrobnChasti;

begin
end.

 И вообще, по-моему Вы привели не полный код своей библиотеки. Как минимум отсутствует название библиотеки, объявление о том, что это именно библиотека, не объявлены модули uses и отсутствуют директивы компилятору.

 
Zoro:



Т.е. передавать массив целых чисел (Integer) ASCII кодов?

Но в MQL нет функции преобразования символа в ASCII код.


#import
 void  SetString(int &Chr[],int);
#import  


void GetStringChars()
   {
    int arChars[];
    string result=StringConcatenate(".........твоя строка........");
   
    int Length=StringLen(result);
    ArrayResize(arChars,Length);
    
    for (int pos=0; pos<Length;pos++)
     {
      arChars[pos]=StringGetChar(result,pos);
     }
     
    //дальше передаешь в DLL
     SetString(arChars,Length); 
   }        
Реализацию процедуры SetString думаю реализуешь сам, там ничего сложного
 

drknn

 И вообще, по-моему Вы привели не полный код своей библиотеки. Как минимум отсутствует название библиотеки, объявление о том, что это именно библиотека, не объявлены модули uses и отсутствуют директивы компилятору. 

Вот заголовок библиотеки:

library sendmsg;

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

{$R *.res}
 

Вряд ли это проблемы с ДЛЛ, скорее с выделением памяти с MQL.

Попробую передавать строку, как посоветовал Kos, но займусь этим на следующей неделе.

Огромное спасибо всем кто откликнулся на призыв о помощи, когда все заработает отпишусь...

 

Возвращаясь к напечатанному...... 

Наконец-то появилось время продолжить создание эксперта.

Потратил два дня на поиск в данном форуме, а также на форумах по windowsAPI. Информацию собирал по крупицам, что называется по зернышку. Очень много написано  по теме как передать строку из МТ4 во внешнее приложение, но нигде не нашел оформленных законченных программных блоков.

Решил передавать строки через Атомы. На мой взгляд это достаточно просто и не приходится использовать внешние DLL. Отсутствие DLL-посредника должно ускорить процесс передачи данных, ИМХО...

Привожу рабочий код для отправки строки из МТ4 в приложение написанное на Делфи, форма имеет заголовок "Form2". Может кому из новичков и пригодится, чтобы не тратить много времени на изучение  и реализацию данной тематики.

1.  Код для отправки строки из МТ4. Реализован через Атомы. 

 

#property copyright "Copyright © 2009, CamoZZi Software Corp."

#include <WinUser32.mqh>
#define WM_USER 0x0400

#import "kernel32.dll"

string GlobalFindAtomA (string lpString);

   int GlobalGetAtomNameA(int nAtom, string lpBuffer, int nSize);
   int GlobalAddAtomA (string lpString);
   int GlobalDeleteAtom (int nAtom);


//----------------------------------------------------------
int init()
{
    string SendData = "Строка символов для обработки внешним приложением";
    int Atom = GlobalAddAtomA(SendData);                  //Функция возвращает порядковый номер, созданного атома

    int hwnd=FindWindowA(null,"Form2");                   // Ищем Handle для FORM2 - Делфи приложение
    
    SendMessageA(hwnd,WM_USER,0,Atom);                    // Передаем порядковый номер атома, в FORM2 - Делфи приложение 
    GlobalDeleteAtom (Atom);                              // Удаляем атом.  

return(0);
}
 


2.  Код для получения строки в приложении на Делфи.

unit Unit2;
  interface
  uses
        Windows, Messages, Classes, SysUtils, Graphics, Controls, StdCtrls, Forms, Dialogs, DBCtrls, DB, DBGrids, DBTables, Grids, ExtCtrls;

private
   { private declarations }
   procedure WMUser (var Msg: TMessage); message WM_USER;

var
   Form2: TForm2;

implementation

{$R *.DFM}


procedure TForm2.WMUser(var Msg: TMessage);
var
   nAtom,LParam:integer;
   p:PChar;
begin
   GetMem(p, 256);
   nAtom:=Msg.LParam;               //Порядковый номер атома, переданного из МТ4
   GlobalGetAtomName(nAtom,p,255);  //получить строку p, по номеру атома nAtom 
   Edit3.Text:=p;
   FreeMem(p);
end;


Замечания и предложения по оптимизации кода выслушаю внимательно. :-) 

 

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

Я использовал FileMapping работающий через DLL. Примерно это выглядит так.

Создаёшь FM для индикаторов туда складываются все значения индикаторов от советников на разных символах.

Потом FM для управления,через него открываешь и закрываешь позиции на разных графиках.

Можно ещё и ещё для разных целей. В итоге получается достаточно сильная система,всё работает очень быстро и возможности анализа ограниченны только возможностью программера

Желаю успехов.

 
zhuki:

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

Я использовал FileMapping работающий через DLL. Примерно это выглядит так.

Создаёшь FM для индикаторов туда складываются все значения индикаторов от советников на разных символах.

Потом FM для управления,через него открываешь и закрываешь позиции на разных графиках.

Можно ещё и ещё для разных целей. В итоге получается достаточно сильная система,всё работает очень быстро и возможности анализа ограниченны только возможностью программера

Желаю успехов.

 

Я не планировал передавать большие объемы.  Но за совет использовать FM для больших объемов, спасибо, приму к сведению. Основной объем информации обрабатывается экспертом, во внешнюю программу выдаются лишь результаты работы эксперта.  Язык MQL дает для этого достаточно большие возможности, для программирования, обработки данных и автоматизированной торговли. Пользуясь случаем хотелось выразить благодарность создателям MQL, в большинстве торговых платформ ничего подобного даже рядом нет. 

zhuki:    Спасибо за  пожелания успехов!

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