Передать структуру в PostMessage из MQL

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

Привет!

Кто-нибудь делал? (MQL5)

Igor Makanu
9589
Igor Makanu  

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

//+------------------------------------------------------------------+
struct s
  {
   int               i;
   bool              b;
  };
//+------------------------------------------------------------------+
union s_uchar
  {
   unsigned char     arr[5];  //sizeof(s) = 5
   s                 result;
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   s_uchar tst;
   tst.result.b = true;
   tst.result.i = 31415926;
   ArrayPrint(tst.arr);
   tst.result.b = false;
   ArrayPrint(tst.arr);
  }
//+------------------------------------------------------------------+
prostotrader
8086
prostotrader  
Igor Makanu:

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

PostMessage - Сообщение другому приложению

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-postmessagea

PostMessageA function (winuser.h)
PostMessageA function (winuser.h)
  • 2018.12.05
  • windows-sdk-content
  • docs.microsoft.com
Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.
TheXpert
18277
TheXpert  
Using Data Copy - Windows applications
Using Data Copy - Windows applications
  • 2018.05.31
  • knicholasa
  • docs.microsoft.com
This topic provides an example that demonstrates how to send information between two applications.
prostotrader
8086
prostotrader  

А бдет ли работать в PostMessage, ведь PostMessage не ждет ответа,

следовательно указатель на структуру "потеряется" или нет?

Добавлено

Remarks
The data being passed must not contain pointers or other references to objects not accessible to the application receiving the data.

While this message is being sent, the referenced data must not be changed by another thread of the sending process.

The receiving application should consider the data read-only. The lParam parameter is valid only during the processing of the message.
The receiving application should not free the memory referenced by lParam. If the receiving application must access the
data after SendMessage returns, it must copy the data into a local buffer.

Добавлено

https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-copydata

WM_COPYDATA message - Windows applications
WM_COPYDATA message - Windows applications
  • 2018.05.31
  • knicholasa
  • docs.microsoft.com
An application sends the WM\_COPYDATA message to pass data to another application.
TheXpert
18277
TheXpert  
prostotrader:

А бдет ли работать в PostMessage, ведь PostMessage не ждет ответа,

следовательно указатель на структуру "потеряется" или нет?

читайте, разбирайтесь. WM_COPYDATA используется для IPC, там априори нельзя указатели передавать, для передачи используется специальная структура.

Второй вариант через HGLOBAL

https://comp.os.ms-windows.programmer.win32.narkive.com/K1P71N8W/inter-process-communication-using-globalalloc

Это если реально в другое приложение.

Если процесс тот же, банальный указатель и простые инструменты синхронизации легко решают проблему.

SeriousRacoon
1078
SeriousRacoon  

Только заполнить массив должного объёма данными по формату структуры. Получить указатель на структуру в мкл нельзя. Т.к. функция асинхронная, массив должен быть static (или в глобальной области видимости). Опасное это дело, т.к. запросто можно вызвать ф-цию несколько раз, а целевое окно ещё не успело подхватить предыдущие из очереди сообщений. Если требуется передавать динамические данные, можно попробовать SendMessageTimeoutW.

ЗЫ GlobalAlloc уже давным-давно, со времен появления Win32, полностью аналогична LocalAlloc и  не может использоваться для межпроцессных коммуникаций.

TheXpert
18277
TheXpert  
SeriousRacoon:

ЗЫ GlobalAlloc уже давным-давно, со времен появления Win32, полностью аналогична LocalAlloc и  не может использоваться для межпроцессных коммуникаций.

Да, вы правы, этот способ давно устарел. мой недосмотр

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