Скачать MetaTrader 5

Нужна помощь!!! Не получается передать строку

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
divert
37
divert  

Решил передавать строки через Атомы. На мой взгляд это достаточно просто и не приходится использовать внешние 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); }

вот возник вопрос как на c# написать обработчик принятого сообщения?

есть код на delphi

 

 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;

divert
37
divert  
я так понимаю надо использовать WndProc ?
Aleksey
248
Aleksey  
Используйте Pipe каналы, просто и быстро. Писал такой обмен между приложением на C# и советником, работает отлично. При этом в приложении можно много потоков запустить, и принимать данные сразу от большого кол-ва советников.
divert
37
divert  
Мне бы примерчик буду очень признателен спасибо
Aleksey
248
Aleksey  
divert:
Мне бы примерчик буду очень признателен спасибо

https://www.mql5.com/ru/articles/503

https://msdn.microsoft.com/ru-ru/library/system.io.pipes.namedpipeclientstream%28v=vs.90%29.aspx


divert
37
divert  
Спасибо. Почитал. Но мне не надо много передавать информации. Мне надо только одну строку с индикатора в клиент на c#.  Идеально подходит atom. Только как это реализовать на c#
o_o
Модератор
24357
o_o  
divert:
Спасибо. Почитал. Но мне не надо много передавать информации. Мне надо только одну строку с индикатора в клиент на c#.  Идеально подходит atom. Только как это реализовать на c#
https://www.youtube.com/watch?v=WK78-jr6jRE
divert
37
divert  
...
using System.Runtime.InteropServices;
...
 
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern uint GlobalGetAtomName(ushort nAtom, StringBuilder lpBuffer, int nSize);
 
        const int WM_USER = ???; // подставить значение
 
        protected override void WndProc(ref Message m)
        {
            if(m.Msg == WM_USER)
            {
                StringBuilder sb = new StringBuilder(255);
 
                GlobalGetAtomName((ushort)m.LParam, sb, 255);
 
                textBox1.Text = sb.ToString();
            }
 
            base.WndProc(ref m);
        }
работает но я передаю 10 символов . а отображаеться только первый. почему остальных нет ?
вот так передаю
divert
37
divert  

вот так передаю 

string SendData = "1234567890";
int Atom = GlobalAddAtomA(SendData);  
string str;
int hwnd=FindWindowW(str,"Form1");                
 if(hwnd==0)
     {
      Comment("\n Не найдено окно ",
              "\n Хендл окна  ",hwnd);
     }
   else {Comment("\n Хендл окна  ",hwnd
   
   );
   
SendMessageA(hwnd,WM_USER,0,Atom);                    
GlobalDeleteAtom (Atom);  
Slava
Модератор
7014
Slava  

В MQL4 строки - юникодные. И вы пытаетесь передать юникодные строки в ансишные функции

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

При этом совершенно законно используете юникодную функцию FindWindowW

divert
37
divert  
Я вас понял. Так почему только первый символ строки отображается? Как в си переделать на Анси тогда?
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий