on tick и on time - страница 2

 
emelenium:

не работает чего то

 

#import "user32.dll"
int RegisterWindowMessageA (string param);
#import 

#define SCRIPT_NAME "Shutdown.mq4"
#define MT4_MESSAGE "MetaTrader4_Internal_Message" 

PostMessageA(WindowHandle(Symbol(),PERIOD_CURRENT),RegisterWindowMessageA(MT4_MESSAGE), 16, SCRIPT_NAME);

 

почему может не работать?


Если вызывать этот код из MQL4, то, действительно, работать не будет, т. к. все строки в новом MQL - юникодные. Вариант с PostMessageW (и RegisterWindowMessageW) также не работает. Поэтому выход один - вызывать функцию из DLL, в которой строки SCRIPT_NAME и MT4_MESSAGE - ANSI.

P. S. Ну и название скрипта должно быть без расширения. 

 
Scriptong:


Если вызывать этот код из MQL4, то, действительно, работать не будет, т. к. все строки в новом MQL - юникодные. Вариант с PostMessageW (и RegisterWindowMessageW) также не работает. Поэтому выход один - вызывать функцию из DLL, в которой строки SCRIPT_NAME и MT4_MESSAGE - ANSI.

P. S. Ну и название скрипта должно быть без расширения. 


Можно. Если название скрипта перевести в массив char. И передавать его при помощи SendMessageA (PostMessage тут не подойдёт по определению)
 

Пробую не так и не так не работает ни через ServiceLoadScriptW не работает.

Может у кого рабочий пример есть?? 

 
stringo:

Можно. Если название скрипта перевести в массив char. И передавать его при помощи SendMessageA (PostMessage тут не подойдёт по определению)

В сторону SendMessage даже не думал, т. к. она ждет ответа, а во многих случаях это приводит к банальному локу.
 
emelenium:

Пробую не так и не так не работает ни через ServiceLoadScriptW не работает.

Может у кого рабочий пример есть?? 


Приведенный пример работает только при вызове из DLL. Возможно, завтра вынесу этот пример отдельно: эксперт + скрипт + DLL.
 
Промучался, из dll тоже не вышло. Да такой пример помог бы !
 
Scriptong:

В сторону SendMessage даже не думал, т. к. она ждет ответа, а во многих случаях это приводит к банальному локу.

В этом главное отличие SendMessage. Она выполняется в том же потоке. А раз в том же потоке, то можно и ссылки на локальную память передавать. А как ещё можно передать имя скрипта?
 
stringo:

В этом главное отличие SendMessage. Она выполняется в том же потоке. А раз в том же потоке, то можно и ссылки на локальную память передавать. А как ещё можно передать имя скрипта?


У меня получается через PostMessage. Дело в том, что для код DLL далеко не весь выполняется в потоке МТ (в ней создается один или более потоков). В этом случае стараюсь избегать вызовов SendMessage там, где это возможно.

 
emelenium:
Промучался, из dll тоже не вышло. Да такой пример помог бы !


Ловите.

Правда, из OnInit вызывать WindowHandle не рекомендуется (в примере это так), т. к. окно чарт может быть еще не создано. 

Файлы:
mql4.zip  24 kb
vsproject.zip  13 kb
 
А на Delphi есть? А то  VCC нет у меня
Причина обращения: