【发布时间】:2016-05-06 09:43:49
【问题描述】:
对 PInvoke 函数“ReleaseCapture”的调用使堆栈失衡。 这可能是因为托管的 PInvoke 签名不匹配 非托管目标签名。检查调用约定和 PInvoke 签名的参数与目标非托管签名匹配。
该功能已以这种方式定义,并且已经运行了 6 年以上。在用户报告它之前,我们没有得到这个错误的消息。当用户开始在屏幕上拖动用户控件时会发生这种情况,如果没有拖动它就可以了。
<DllImport("user32")> _
Public Shared Function ReleaseCapture(ByVal hwnd As IntPtr) As Integer
End Function
在用户控件MouseDown 事件上调用此函数。例如:
Private Sub uxCalcTitleBar_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles uxCalcTitleBar.MouseDown, lblCalcTitle.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left And e.Clicks = 1 Then
If Not Me._CalcIsMoving And Not Me._CalcIsPackedForMove Then
Me.Calc_PackForMove()
End If
ReleaseCapture(Me.uxCalculator.Handle) **ERROR HERE**
SendMessage(Me.uxCalculator.Handle, WM_SYSCOMMAND, MOUSE_MOVE, 0)
Me._CalcNewLocation = Me.uxCalculator.Location
Me.uxCalcTitleBar_MouseUp(sender, e)
End If
End Sub
我们注意到一件事,这是在从 2.0 迁移到 4.5 框架后开始发生的。不知道这是否有区别,但我认为不应该。经过一番研究,我发现解决方案应该是审查托管平台调用签名和调用约定,以确认它与本机目标的签名和调用约定匹配。
我的尝试
我检查了签名,它似乎很好,我实际上什么都看不到。我还指定了这样的约定来清除它没有帮助的堆栈......
<DllImport("user32", CallingConvention:=CallingConvention.Cdecl)> _
Public Shared Function ReleaseCapture(ByVal hwnd As IntPtr) As Integer
End Function
【问题讨论】:
-
来自MSDN:
BOOL WINAPI ReleaseCapture(void);不需要参数。 -
是的,您可以将它用于拖动功能。您可以在 mousedown 事件上然后发送一条消息,它代表事件...pinvoke.net/default.aspx/user32.releasecapture
-
有人能解释一下否决票吗?所以我可以编辑我的问题...
-
如果您浏览 Related 下的一些条目,您会发现它们都有相同的源问题:whacky params(好吧,反正我看过的 3 个)