调用导致堆栈不对称 程序崩溃怎么解?
vb.net吧
全部回复
仅看楼主
level 1
蓝梦妖蝶 楼主
写了一个按键精灵的小程序。在线程中调用时总是卡死,debug只显示
mouse_event”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配
但是这个错误,可以跳过,不影响程序运行。在debug模式下,程序可以运行成功。而且在程序运行的时候,单独运行也是没问题。
测试流程是,启动多线程测试程序,按键精灵先点击被测程序,然后在示波器上读取数据。然后保存数据。然后多次测试后,结束线程。
程序已经完成示波器测试了。说明这段按键精灵程序,已经运行过了。
难道是鼠标调用与多线程之间有什么要注意的地方?
下边是按键精灵的代码
Imports System.Runtime.InteropServices
Module mouse
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Integer)
Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Integer)
'<DllImport("User32.dll", CallingConvention:=CallingConvention.StdCall, EntryPoint:="GetWindowThreadProcessId")>
'Sub mouse_event(ByVal dwFlags As Integer)
'End Sub
Public Const MOUSEEVENTF_LEFTDOWN As Integer = &H2 '模拟鼠标左键按下
Public Const MOUSEEVENTF_LEFTUP As Integer = &H4 '模拟鼠标左键释放
Public Const MOUSEEVENTF_MIDDLEDOWN As Integer = &H20 '模拟鼠标中间键按下
Public Const MOUSEEVENTF_MIDDLEUP As Integer = &H40 '模拟鼠标中间键释放
Public Const MOUSEEVENTF_RIGHTDOWN As Integer = &H8 '模拟鼠标右键按下
Public Const MOUSEEVENTF_RIGHTUP As Integer = &H10 '模拟鼠标右键释放
Public Const MOUSEEVENTF_MOVE As Integer = &H1 '模拟鼠标指针移动
Public Const MOUSEEVENTF_ABSOLUTE As Integer = &H8000 '鼠标绝对位置
Public Sub MOUSE_CTRL(ByVal vba_mouse As String)
Dim outtext() As String = Split(vba_mouse, vbCrLf)
Dim read_data_str As String = ""
For i = 0 To outtext.Length - 1
Dim star As String = Split(outtext(i), " ")(0)
Select Case star
Case "MoveTo"
outtext(i) = Replace(outtext(i), “, ”, “ ”)
Dim x As Integer = Val((Split(outtext(i), " ")(1)))
Dim y As Integer = Val(Split(outtext(i), " ")(2))
Cursor.Position = New Point(x, y)
Case "Delay"
System.Threading.Thread.Sleep(Val(Split(outtext(i), " ")(1)))
Case "LeftDown"
mouse_event(MOUSEEVENTF_LEFTDOWN)
Case "LeftClick"
mouse_event(MOUSEEVENTF_LEFTDOWN)
mouse_event(MOUSEEVENTF_LEFTUP)
Case "LeftUp"
mouse_event(MOUSEEVENTF_LEFTUP)
Case "KeyDown"
If InStr(outtext(i), "Num") Then
outtext(i) = Replace(outtext(i), “""Num ”, “”)
outtext(i) = Replace(outtext(i), “"",”, “”)
Dim key_send As String = (Split(outtext(i), " ")(1))
'key_send = Replace(key_send, “""”, “”)
SendKeys.Send(key_send)
End If
End Select
Next
End Sub
End Module
下边是部分调用程序,是一个小的测试程序
启动线程
buffer_test_thread = New Thread(AddressOf Buffer_test) ''构造线程
buffer_test_thread.Name = "Buffer_test"
buffer_test_thread.Start() ''启动线程
线程中调用
If BF_rbtnSMA_VBS.Checked Then
MOUSE_CTRL(NET_txtSD.Text)
End If
2019年09月19日 12点09分 1
level 1
蓝梦妖蝶 楼主
FileOpen(1, Application.StartupPath + "\" & testname & "_test.csv", OpenMode.Output) ''输出txt文档
Print(1, VI_txtfinal.Text) ''如果没有建立文件夹,就使用文件夹名。会卡死。
FileClose(1)
感觉是卡死在这里的。测试完成一写文件就死了。
鼠标控制和这个有什么冲突呢
2019年09月20日 01点09分 2
level 1
蓝梦妖蝶 楼主

已解决
把引用这么写就好了
<DllImport("User32.dll", CallingConvention:=CallingConvention.StdCall)>
Sub mouse_event(ByVal dwFlags As Integer)
2019年09月20日 02点09分 3
1