如何在visual basic 2012中解决不平衡堆栈?

时间:2014-11-20 09:18:44

标签: vb.net visual-studio-2012 stack

这是我得到的错误

附加信息:调用PInvoke函数'cobawebcamsss!cobawebcamsss.Form1 :: SendMessage'使堆栈失衡。这很可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。

以下是代码:

选项明确开启 选项严格关闭

Public Class Form1

Const WM_CAP As Short = &H400S
Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP + 10
Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP + 11
Const WM_CAP_EDIT_COPY As Integer = WM_CAP + 30
Const WM_CAP_SET_PREVIEW As Integer = WM_CAP + 50
Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP + 52
Const WM_CAP_SET_SCALE As Integer = WM_CAP + 53
Const WS_CHILD As Integer = &H40000000
Const WS_VISIBLE As Integer = &H10000000
Const SWP_NOMOVE As Short = &H2S
Const SWP_NOSIZE As Short = 1
Const SWP_NOZORDER As Short = &H4S
Const HWND_BOTTOM As Short = 1
Dim iDevice As Integer = 0
Dim hHwnd As Integer
' Declare Function
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Object) As Integer
Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
Declare Function DestroyWindow Lib "user32" (ByVal hndw As Integer) As Boolean
Declare Function capCreateCaptureWindowA Lib "avicap32.dll" (ByVal lpszWindowName As String, ByVal dwStyle As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Short, ByVal hWndParent As Integer, ByVal nID As Integer) As Integer
Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriver As Short, ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, ByVal cbVer As Integer) As Boolean

Private Sub LoadDeviceList()
    Dim strName As String = Space(100)
    Dim strVer As String = Space(100)
    Dim bReturn As Boolean
    Dim x As Integer = 0
    Do
        bReturn = capGetDriverDescriptionA(x, strName, 100, strVer, 100)
        If bReturn Then lstDevices.Items.Add(strName.Trim)
        x += 1
    Loop Until bReturn = False
End Sub

Private Sub OpenPreviewWindow()
    Dim iHeight As Integer = picCapture.Height
    Dim iWidth As Integer = picCapture.Width
    hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, 480, picCapture.Handle.ToInt32, 0)
    If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) Then
        SendMessage(hHwnd, WM_CAP_SET_SCALE, True, 0)
        SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0)
        SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0)
        SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, picCapture.Width, picCapture.Height, SWP_NOMOVE Or SWP_NOZORDER)
        btnSave.Enabled = True
        btnStop.Enabled = True
        btnStart.Enabled = False
    Else
        DestroyWindow(hHwnd)
        btnSave.Enabled = False
    End If
End Sub

Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
    Dim data As IDataObject
    Dim bmap As Image
    SendMessage(hHwnd, WM_CAP_EDIT_COPY, 0, 0)
    data = Clipboard.GetDataObject()
    If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then
        bmap = CType(data.GetData(GetType(System.Drawing.Bitmap)), Image)
        picCapture.Image = bmap
        ClosePreviewWindow()
        btnSave.Enabled = False
        btnStop.Enabled = False
        btnStart.Enabled = True
        If sfdImage.ShowDialog = DialogResult.OK Then
            bmap.Save(sfdImage.FileName, Imaging.ImageFormat.Bmp)
        End If
    End If
End Sub

Private Sub ClosePreviewWindow()
    SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, iDevice, 0)
    DestroyWindow(hHwnd)
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    LoadDeviceList()
End Sub

Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
    OpenPreviewWindow()
    btnStart.Enabled = False
    btnStop.Enabled = True
End Sub

Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
    ClosePreviewWindow()
    btnStart.Enabled = True
    btnStop.Enabled = False
End Sub

结束班

当我中断操作时,它突出显示了

如果SendMessage(hHwnd,WM_CAP_DRIVER_CONNECT,iDevice,0)那么

请帮助,我是视觉基础的新手,所以我尝试向其他人学习,但它没有用,它最初来自visual basic 2010,我把它复制到visual basic 2012

1 个答案:

答案 0 :(得分:1)

如果您收到有关PInvoke..SendMessage的错误,请尝试替换该行:

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Object) As Integer

使用:

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByRef RECT As IntPtr) As IntPtr

之后,在我的Win7 x64上运行良好。