Разбалавнсировка стека
От: Qb1024  
Дата: 30.04.11 19:17
Оценка:
Почему так, есть вроде бы простой и понятный код, который есть на многих сайтах:
Private Declare Function FindWindow _ 
        Lib "user32.dll" Alias "FindWindowA" ( _ 
        ByVal lpClassName As String, _ 
        ByVal lpWindowName As String) As Long 
Private Declare Function ShowWindow _ 
        Lib "user32.dll" ( _ 
        ByVal hWnd As Long, _ 
        ByVal nCmdShow As Long) As Long 

Private Sub HiddenTaskBar() 
    ShowWindow( FindWindow("Shell_TrayWnd", vbNullString), 0&) 
End Sub 

Private Sub VisibleTaskBar() 
    ShowWindow( FindWindow("Shell_TrayWnd", vbNullString), 4&)
End Sub


Но при попытке вызова HiddenTaskBar() получаю ошибку:

Помощник отладки управляемого кода "PInvokeStackImbalance" обнаружил неполадку в "...\WindowsApplication5\WindowsApplication5\bin\De bug\WindowsApplication5.vshost.exe". Дополнительные сведения: Вызов функции PInvoke "WindowsApplication5!WindowsApplication5.Form1::Sho wWindow" разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры PInvoke совпадают с неуправляемой целевой сигнатурой.


Пишу в 2010 студии.
Как от этого избавится?
Re: Разбалавнсировка стека
От: rtbsd http://rtbsd.org/
Дата: 01.05.11 05:31
Оценка:
Здравствуйте, Qb1024, Вы писали:

Q>Вызов функции PInvoke "WindowsApplication5!WindowsApplication5.Form1::Sho wWindow" разбалансировал стек. ...


Вероятно, ему не хватает


<DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True, _
CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _ ' <<<<<
Public Shared Function _
MoveFile(ByVal src As String, ByVal dst As String) As Boolean
   ' This function copies a file from the path src to the path dst.
   ' Leave function empty - DLLImport attribute forces calls 
   ' to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL.
End Function
Все написано там
Re[2]: Разбалавнсировка стека
От: Qb1024  
Дата: 01.05.11 06:05
Оценка:
Здравствуйте, rtbsd
Попробовал поставить ваш код, но ошибка всё та же. вот полный код проги:

Imports System.IO
Imports System
Imports System.Runtime.InteropServices
Imports System.Windows.Forms

Public Class Form1
    <DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True, _
CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function _
    MoveFile(ByVal src As String, ByVal dst As String) As Boolean
        ' This function copies a file from the path src to the path dst.
        ' Leave function empty - DLLImport attribute forces calls 
        ' to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL.
    End Function

    Private Declare Function FindWindow _
        Lib "user32.dll" Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
    Private Declare Function ShowWindow _
            Lib "user32.dll" ( _
            ByVal hWnd As Long, _
            ByVal nCmdShow As Long) As Long

    Private Sub HiddenTaskBar()
        ShowWindow(FindWindow("Shell_TrayWnd", vbNullString), 0&)
    End Sub

    Private Sub VisibleTaskBar()
        ShowWindow(FindWindow("Shell_TrayWnd", vbNullString), 4&)
    End Sub

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        HiddenTaskBar()
    End Sub
End Class
Re[3]: Разбалавнсировка стека
От: rtbsd http://rtbsd.org/
Дата: 01.05.11 14:48
Оценка:
Здравствуйте, Qb1024, Вы писали:

Q>Здравствуйте, rtbsd

Q>Попробовал поставить ваш код, но ошибка всё та же. вот полный код проги:

Имеется ввиду, вот эта часть

 <DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True, _
CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _

Должна сопровождать каждую импортированную функцию. Или, возможно, где-то в настройках транслятора есть возможность включить Calling convention = stdcall по-умолчанию, чтобы везде его явно не писать.
Все написано там
Re[4]: Разбалавнсировка стека
От: Qb1024  
Дата: 01.05.11 15:00
Оценка:
Ругается, что DllImport нельзя использовать с declare и вот так писать нельзя:

    <DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True, _
CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _
    Private Declare Function FindWindow _
        Lib "user32.dll" Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
Re[5]: Разбалавнсировка стека
От: rtbsd http://rtbsd.org/
Дата: 01.05.11 15:17
Оценка:
Здравствуйте, Qb1024, Вы писали:

Q>Ругается, что DllImport ...


Ну а если все-таки почитать MSDN и правильно написать:
<DllImport("USER32.DLL", EntryPoint:="FindWindowW", SetLastError:=True, _
CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function _
FindWindow(ByVal src As String, ByVal dst As String) As Boolean
    ' Just blank function body
End Function
Все написано там
Re[6]: Разбалавнсировка стека
От: rtbsd http://rtbsd.org/
Дата: 01.05.11 15:27
Оценка: 3 (1)
Здравствуйте, rtbsd, Вы писали:

R>Здравствуйте, Qb1024, Вы писали:


Q>>Ругается, что DllImport ...


R>Ну а если все-таки почитать MSDN и правильно написать:

R>
R><DllImport("USER32.DLL", EntryPoint:="FindWindowW", SetLastError:=True, _
R>CharSet:=CharSet.Unicode, ExactSpelling:=True, _
R>CallingConvention:=CallingConvention.StdCall)> _
R>Public Shared Function _
R>FindWindow(ByVal src As String, ByVal dst As String) As Boolean
R>    ' Just blank function body
R>End Function
R>


Да, и еще, в .Net Long -- точно 32-разрядные? Не 64, случайно?
Все написано там
Re[7]: Разбалавнсировка стека
От: Qb1024  
Дата: 01.05.11 15:32
Оценка:
Long — 64 битовое целое число
С FindWindow с горем пополам получилось, при попытке так же объявить ShowWindow опять разбалансировка стека.
Я ещё не понимаю, почему на всех сайтах функции и user32 объявляются просто как Private Declare Function без DLLImport?
Re[8]: Разбалавнсировка стека
От: rtbsd http://rtbsd.org/
Дата: 01.05.11 15:40
Оценка:
Здравствуйте, Qb1024, Вы писали:

Q>Long — 64 битовое целое число

Ну дык
А хендлы окон, указатели вообще все остальное в 32-р Windows -- 32-разрядное. Вот оно и не соответствует по параметрам в стеке.
Все написано там
Re[9]: Разбалавнсировка стека
От: Qb1024  
Дата: 01.05.11 15:43
Оценка:
Здравствуйте, rtbsd, Вы писали:

R>Здравствуйте, Qb1024, Вы писали:


Q>>Long — 64 битовое целое число

R>Ну дык
R>А хендлы окон, указатели вообще все остальное в 32-р Windows -- 32-разрядное. Вот оно и не соответствует по параметрам в стеке.

Я так понял, что нужно юзать не Long, а integer? И всё из-за этого???
Re[10]: Разбалавнсировка стека
От: Qb1024  
Дата: 01.05.11 15:45
Оценка:
Здравствуйте, Qb1024, Вы писали:

Q>Здравствуйте, rtbsd, Вы писали:


R>>Здравствуйте, Qb1024, Вы писали:


Q>>>Long — 64 битовое целое число

R>>Ну дык
R>>А хендлы окон, указатели вообще все остальное в 32-р Windows -- 32-разрядное. Вот оно и не соответствует по параметрам в стеке.

Q>Я так понял, что нужно юзать не Long, а integer? И всё из-за этого???


Блин, просто поменял в своём самом первом коде long на integer и всё заработало!
Спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.