2015-06-04 4 views
-2

У меня есть неуправляемая DLL с delphi и интегрированы некоторые события, которые срабатывают в определенные моменты времени выполнения. В своем руководстве говорится, что он вызывает Win32 api PostMessage().Событие, когда postmessage() получает C#

Когда событие запущено, отправляется текстовое сообщение, а у wParam и IParam есть другая информация.

Как я могу запустить событие из моего приложения C#, когда сообщение из DLL отправлено и, конечно, получает информацию?

UPDATE:

Пытаясь описать то, что руководство говорит: Так у меня есть функция под названием Init(), которая принимает параметр ручки, который я передаю следующим образом:

wr.Init((IntPtr)this.Handle); 

из C# Winform-приложение для неуправляемой dll, которая возвращает true, если это нормально, и это то, что я вижу.

Теперь руководство говорит:

Когда событие (из DLL) обжигают он посылает сообщение окна к оконной ручке поставляется с функцией Init, Infact PostMessage() Win32 API называется.

И у меня есть список сообщений, которые отправляются на PostMessage(), например:

TextMessage: WM_TECH_BROKENLINE 
wParam: Point (which is a number displaying for example where is broken) 
IParam: 0 

Теперь, как я объяснил, что я хочу, что когда сообщение как один выше размещен от длл я огонь событие из C# и, конечно, получить текстовое сообщение и Params

ответ

1

шаги, необходимые являются следующие:

  1. получить ветер ow для окна в вашей программе C#.
  2. Передайте этот дескриптор окна неуправляемой DLL, чтобы он знал, куда отправлять сообщения.
  3. В коде C# добавьте код для получения и ответа на поступающее сообщение.

В качестве альтернативы вышеизложенному вы, возможно, предпочтете, чтобы окна графического интерфейса вашей программы были отделены от этого механизма передачи сообщений. В этом случае выполните следующие действия:

  1. Создайте подкласс NativeWindow для обработки входящих сообщений.
  2. Создайте экземпляр своего класса и передайте его дескриптор окна в неуправляемую DLL.
  3. Переопределите WndProc в вашем классе окна, а затем обработайте сообщение там. В этот момент вы можете нарисовать его как событие.

Этот последний подход дает лучшее разделение вашего кода взаимодействия из вашего графического интерфейса и позволит вам сделать вашу обертку менее запутанной с вашим графическим интерфейсом.

Чтобы описать все это более подробно, вам нужно будет узнать детали вашей программы.Например, это WinForms или WPF? Есть ли у вашей программы окно для получения сообщений? Как закодирована строка? В каком сообщении arg оно прибывает? Как память для строки освобождается, если сообщение передается асинхронно?

Я подозреваю, что у вас будут ответы на некоторые из этих вопросов, но, возможно, не все. Теперь вы знаете на высоком уровне, что вам нужно сделать, но теперь вам нужно узнать больше деталей для своей собственной программы.

+0

Так извините за то, что некоторую информацию. Это приложение Winforms в C#, и я уже получил дескриптор окна и отправил его в неуправляемую dll, но теперь я не знаю, как захватить событие. – Combinu

+0

Я ответил на вопрос, который вы задали с соответствующим количеством деталей. Вопрос и ответ остаются хорошо подобранными. Возможно, ваша следующая задача - потратить время, необходимое для того, чтобы сделать вопрос достаточно подробным, чтобы найти желаемый ответ. –

+0

Обновленный вопрос, возможно, может помочь больше, но это вся информация, к которой я к несчастью:/ – Combinu

0

Попробуйте переопределить WndProc метод формы, с которой вы переходите в dll. В качестве примера можно найти здесь: https://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc(v=vs.110).aspx

Упрощенный пример для случая (добавить его в свой класс формы):

const int WM_TECH_BROKENLINE = 0x0401; // It's WM_USER + 1 in my example. 
              // Set it according to you dll's spec 
    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_TECH_BROKENLINE) 
     { 
       long dataPassedFromTheDll = (long)m.WParam; 
       // Your stuff here: 
       this.Text = string.Format("The dll sent us: {0}", dataPassedFromTheDll); 
     } 
     base.WndProc(ref m); 
    } 
+0

Функция из dll нуждается в качестве параметра, который передаю дескриптор так, чтобы это не было проблемой ... Все, что мне нужно, это то, что я запускаю событие, когда есть что-то, размещенное на Win32, поэтому я могу запустить событие на C# стороне и, конечно, получить информацию, размещенную DLL – Combinu

Смежные вопросы