Чтение данных из очереди сообщений C#, Delphi, C++

Имеються две программы Windows Forms. Одна из них ежесекундно считывает данные с контроллера (написана на C++). Вторая (Delphi) при нажатии на соответствующие кнопки отсылает сообщение с помощью SendMessage, окну первой формы. Форма на С++ выдает соответствующие данные и в свою очередь вызывает SendMessage. Обе программы работают коряво.

Задание состоит не трогая программу C++ отображать данные в программе на C#.

Я так понимаю, SendMessage работает с очередью сообщений Windows. Но по коду мне непонятно как они хранятся. То-есть они как бы выбрасываються в поток и потом форма их получает и обрабатывает с помощью своего обработчика?

C# имеет Message Queueing, но там речь идет о том, что сообщения храняться в ActiveDirectory. То-есть сообщение, например, по умолчанию это xml-файл. А данные из него получить можно, вызвав Queue.Receive(), а создание очереди требует путь к ней. То-есть, выходит разный подход к обработке данных.

Это разные принципы работы? Или я что-то не понимаю?

Можно ли получить из програмы на C# данные выдаваемые программой на C++? Ведь способы взаимодействия посредством PipeLine или требуют изменения кода программы на C++.

// Обработчик в Delphi коде:
procedure TfEdit.GetClick(Sender: TObject);
begin
tAsk.Enabled := true;
wAsked := (Sender as TBitBtn).Tag;
SendMessage(FindWindow('ControllerForm', 'Контроллер'), WM_WEIGHT, (Sender as TBitBtn).Tag, Handle);
end;

// Обработчик в C++ коде:
void __fastcall ControllerForm::nWndProc(Messages::TMessage &Message)
{
 int w;
 int WeightSt;
 if (Message.Msg == WM_WEIGHT)
 {
    if (Message.WParam == 0)
    {
      GetWeight(Weights[0], w); // чтение с контроллера
      if (WeightIsSet1)
        {WeightSt = 0;}
      else
        {WeightSt = 2;}
      SendMessage((HANDLE)Message.LParam, WM_WEIGHT, (WPARAM)WeightSt, (LPARAM)w);
    }

Ответы (1 шт):

Автор решения: gbg

Формально, это устроено так - у приложения есть цикл, в котором оно вызывает GetMessages().

Ну и потом длинная конструкция switch/case, которая и определяет дальнейшее поведение программы.

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

Так как на C# можно вызвать любую функцию WinAPI, вы можете реализовать прием и отправку этих сообщений у себя в приложении - создаете окошко, добиваетесь, чтобы программа на C++ была в состоянии ваше окошко найти, дальше разбираетесь с тем, что она шлет

→ Ссылка