Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Зарегистрируйся на MQL5.community, чтобы оставлять комментарии!
Andrew
28
Andrew 2011.06.13 16:20 

Доброго времени суток!

Подскажите, как передать указатель на строковую переменную при использовании сообщения WM_SETTEXT (http://msdn.microsoft.com/en-us/library/ms632644(VS.85).aspx).

Параметры сообщения:

wParam

не используется.

lParam

указатель на строку,заканчивающуюся нулем, содержащую устанавливаемый текст .

В справке по MQL написано: Существует способ передавать в импортируемые dll-функции указатели на переменные. Данные типа string передаются как указатель на соответствующую область памяти.

т.е., как я понимаю, при необходимости передать указатель, в коде ставим имя строковой переменной, и компилятор должен принять ее как указатель.

Однако после выполнения кода

//+------------------------------------------------------------------+
//|                                                        proba.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#import "user32.dll"
int SendMessageA(int hWnd,int Msg,int wParam,int lParam);

#import
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   string st="5.5"; //значение, которое необходимо установить  
   int hW=132630;   //хэндл окна 
   int Ms=0x000C;   //код сообщения WM_SETTEXT
   int res=SendMessageA(hW,Ms,0,st); 
   Print(res);  
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

содержимое окна, в которое передаем значение, обнуляется (проверялось на разных приложениях и разных классах окон). Получается, указываю на что-то другое, а не на нужную строку.

Помогите решить эту проблему...

o_O
Модератор
23275
o_O 2011.06.13 16:27  
RAVen_:

Доброго времени суток!

Подскажите, как передать указатель на строковую переменную

посмотрите пример в МТ
Andrew
28
Andrew 2011.06.13 16:40  
sergeev:
посмотрите пример в МТ

Будьте так добры, укажите ссылку на пример, или текст самого примера. Возможно, я пропустил, но в тех примерах, которые я видел, в качестве параметров передавалось значение переменной, а не указатель на нее.
Комбинатор
15639
Комбинатор 2011.06.13 16:51  
надо в интовый массив запаковывать по ходу.
Андрей
1890
Андрей 2011.06.13 18:52  
int SendMessageA(int hWnd,int Msg,int wParam, string lParam);
Правда же?

Mql- это язык, которому при вызове ф-ций абсолютно наплевать на мелочи типа типов.
Так что строка в исходном примере отлично преобразовывается в число = 0.
Andrew
28
Andrew 2011.06.13 20:35  
jartmailru:
int SendMessageA(int hWnd,int Msg,int wParam, string lParam);
Правда же?

Спасибо, заработало...

Mql- это язык, которому при вызове ф-ций абсолютно наплевать на мелочи типа типов.
Так что строка в исходном примере отлично преобразовывается в число = 0.

Тут посетила внезапная мысль: возможно, разгадка кроется в уже озвученной фразе из справки:

Данные типа string передаются как указатель на соответствующую область памяти

т.е., объявляя функцию таким образом, в SendMessageA как раз указатель и попадает, а его "размерность", как и для типа int - 32 бита... так что для функции мелочь "типа типов" хоть криво, но соблюдена...

P.S. :-D остается только надеяться, что в дальнейшем не понадобится сообщение, в котором последний параметр обязательное число... :-D

o_O
Модератор
23275
o_O 2011.06.13 20:52  
RAVen_:

Будьте так добры, укажите ссылку на пример

папка sample.

странно, что вы её не видите.

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