2015-06-04 59 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)被觸發它發送窗口消息到與初始化函數提供的窗口句柄,事實上PostMessage的()的Win32 API被調用。

,我已經被例如在PostMessage的()發送的消息的列表:

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

現在,作爲我解釋我想的是,當像之一的消息的上方從貼DLL我從C#觸發一個事件,並ofcourse收到短信和PARAMS

回答

1

的必要步驟如下:

  1. 獲取風處理C#程序中的窗口。
  2. 將該窗口句柄傳遞給非託管DLL,以便它知道在哪裏發送消息。
  3. 在您的C#代碼中,添加代碼以接收和響應到達的消息。

作爲上述替代方案,您可能更願意將程序的GUI窗口與此消息傳遞機制分開。在這種情況下,請執行以下操作:

  1. 創建NativeWindow的子類來處理傳入消息。
  2. 創建類的實例並將其窗口句柄傳遞給非託管DLL。
  3. 在您的窗口類中重寫WndProc,然後在那裏處理消息。在這一點上,您可以將其表現爲事件。

這後一種方法可以更好地將您的interop代碼從GUI中分離出來,並且可以使您的包裝與GUI更少地纏結。

爲了更詳細地描述這些,你需要知道你的程序的細節。例如,它是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