Почему так, есть вроде бы простой и понятный код, который есть на многих сайтах:
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 совпадают с неуправляемой целевой сигнатурой.
Здравствуйте, 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
Здравствуйте, 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
Должна сопровождать каждую импортированную функцию. Или, возможно, где-то в настройках транслятора есть возможность включить Calling convention = stdcall по-умолчанию, чтобы везде его явно не писать.
Здравствуйте, 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 bodyEnd Function
Здравствуйте, 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, случайно?
Long — 64 битовое целое число
С FindWindow с горем пополам получилось, при попытке так же объявить ShowWindow опять разбалансировка стека.
Я ещё не понимаю, почему на всех сайтах функции и user32 объявляются просто как Private Declare Function без DLLImport?
Здравствуйте, Qb1024, Вы писали:
Q>Long — 64 битовое целое число
Ну дык
А хендлы окон, указатели вообще все остальное в 32-р Windows -- 32-разрядное. Вот оно и не соответствует по параметрам в стеке.
Здравствуйте, rtbsd, Вы писали:
R>Здравствуйте, Qb1024, Вы писали:
Q>>Long — 64 битовое целое число R>Ну дык R>А хендлы окон, указатели вообще все остальное в 32-р Windows -- 32-разрядное. Вот оно и не соответствует по параметрам в стеке.
Я так понял, что нужно юзать не Long, а integer? И всё из-за этого???
Здравствуйте, Qb1024, Вы писали:
Q>Здравствуйте, rtbsd, Вы писали:
R>>Здравствуйте, Qb1024, Вы писали:
Q>>>Long — 64 битовое целое число R>>Ну дык R>>А хендлы окон, указатели вообще все остальное в 32-р Windows -- 32-разрядное. Вот оно и не соответствует по параметрам в стеке.
Q>Я так понял, что нужно юзать не Long, а integer? И всё из-за этого???
Блин, просто поменял в своём самом первом коде long на integer и всё заработало!
Спасибо