我有一个带有delphi的非托管DLL,并且集成了一些在运行时某些点触发的事件。
在其手册中,它表示它调用了Win32 api PostMessage()
。
当事件被触发时,会发送一条短信,wParam和IParam会有其他信息。
当发布来自dll的消息并且获取信息时,如何从我的c#应用程序中触发事件?
更新:
试图描述手册的内容: 所以我有一个名为init()的函数,它接受我传递的handle参数,如下所示:
wr.Init((IntPtr)this.Handle);
从c#Winform应用程序到非托管dll,如果没问题则返回true,这就是我所看到的。
现在手册说:
当事件(来自dll)被触发时,它会向随Init函数提供的窗口句柄发送一条Windows消息,实际上调用了PostMessage()Win32 API。
我有PostMessage()上发送的消息列表,例如:
TextMessage: WM_TECH_BROKENLINE
wParam: Point (which is a number displaying for example where is broken)
IParam: 0
现在正如我解释的那样,我希望当从dll发布上面的消息时,我会从c#和oncourse发出一个事件来获取短信和Params
答案 0 :(得分:1)
必要的步骤如下:
作为上述替代方案,您可能更喜欢将程序的GUI窗口与此消息传递机制分开。在这种情况下,请执行以下操作:
NativeWindow
的子类来处理传入的消息。WndProc
,然后在那里处理消息。此时,您可以将其表现为事件。后一种方法可以更好地将您的互操作代码与您的GUI分离,并且可以让您的封装更少与GUI混淆。
为了更详细地描述这些内容,需要了解程序的详细信息。例如,它是WinForms还是WPF?您的程序是否有一个窗口可以接收消息?字符串是如何编码的?它在哪个消息arg到达?如果消息是异步传递的,那么字符串的内存是如何解除分配的?
我怀疑你会回答其中一些问题,但也许不是全部。您现在知道自己需要做什么,但现在需要了解自己程序的更多细节。
答案 1 :(得分:0)
尝试覆盖处理您传递给dll的表单的WndProc
方法。可以在此处找到一个示例: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);
}