Почему функция Win32 CascadeWindows создает исключение AccessViolationException для Windows 7 - PullRequest
2 голосов
/ 31 августа 2010
Private Declare Function CascadeWindowsNative Lib "user32" Alias "CascadeWindows" ( _
   ByVal hwndParent As Long, _
   ByVal wHow As Long, _
   ByVal lpRect As Long, _
   ByVal cKids As Long, _ 
   ByVal lpkids As Long) As Integer

вызов:

CascadeWindowsNative(Nothing, &H4, 0, 0, 0)

Ответы [ 2 ]

2 голосов
/ 31 августа 2010

Основная проблема заключается в том, что вы передаете значения дескриптора с типом Long. Это неверно, их нужно передавать через тип IntPtr. Под хуками маркеры по сути являются указателями и различаются по размеру в зависимости от того, является ли процесс 32-битным или 64-битным.

Я не знаком с этим API, поэтому не знаю, верны ли остальные параметры или нет. Пример кода на PInvoke.Net предполагает, что некоторые из них должны быть напечатаны на что-то отличное от Long

Вероятно, здесь происходит то, что один из компьютеров, на котором вы работаете, является 64-разрядным, и вызов pinvoke работает, а другой - 32-разрядный, и вызов не выполняется из-за присущего дисбаланса стека.

1 голос
/ 31 августа 2010

Это работает:

Private Declare Function CascadeWindowsNative Lib "user32" Alias "CascadeWindows" (ByVal hwndParent As IntPtr,
                                                                                   ByVal wHow As UInt32,
                                                                                   ByVal lpRect As IntPtr,
                                                                                   ByVal cKids As UInt32,
                                                                                   ByVal lpkids() As IntPtr) As Integer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...