Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ошибка вызова MenuItemFromPoint / 5 сообщений из 5, страница 1 из 1
07.03.2005, 13:12:43
    #32949530
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка вызова MenuItemFromPoint
При вызове функции MenuItemFromPoint ошибка:
Код: plaintext
1.
Run-tine error '49':
Bad DLL Calling convention
Что делать? Функции объявлял из API Viewer. Изменил только последний параметр в функции MenuItemFromPoint.
Было так:ByVal ptScreen As POINTAPI, а переделал на: ptScreen As POINTAPI
Вот мой пример:
1. Создайте на форме меню.
2. Код
Код формы:
Код: plaintext
1.
2.
3.
4.
5.
Option Explicit

Private Sub Form_Initialize()
    ' Запускаем субкласс
    wlOldProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf wlNewProc)
End Sub
Код модуля:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
Option Explicit

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Declare Function GetMenu Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function MenuItemFromPoint Lib "user32" (ByVal hWnd As Long, ByVal hMenu As Long, ptScreen As POINTAPI) As Long

Public Const GWL_WNDPROC As Long = - 4 
Public wlOldProc As Long

Public Const WM_NCMOUSEMOVE = &HA0
Public Const HTMENU =  5 

Public Type POINTAPI
        x As Long
        y As Long
End Type


'/*
' Новая оконная процедура
Public Function wlNewProc(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim PAPI As POINTAPI, i As Long
    Select Case wMsg
        Case WM_NCMOUSEMOVE
            If wParam = HTMENU Then 'hit-test value
                PAPI = MakePoints(ByVal lParam)
                'Debug.Print "X="; PAPI.x; "Y="; PAPI.y
                Debug.Print "Menu position:"; MenuItemFromPoint(ByVal hWnd&, ByVal GetMenu(ByVal hWnd), PAPI)
            End If
    End Select
    wlNewProc = CallWindowProc(wlOldProc, hWnd, wMsg, wParam, lParam)
End Function
'/*
Public Function LoWord(LongIn As Long) As Integer
     If (LongIn And &HFFFF&) > &H7FFF Then
          LoWord = (LongIn And &HFFFF&) - &H10000
     Else
          LoWord = LongIn And &HFFFF&
     End If
End Function

'/*
Public Function HiWord(LongIn As Long) As Integer
     HiWord = (LongIn And &HFFFF0000) \ &H10000
End Function

'/*
Public Function MakePoints(ByVal lParam As Long) As POINTAPI
    MakePoints.x = LoWord(lParam)
    MakePoints.y = HiWord(lParam)
End Function
...
Рейтинг: 0 / 0
07.03.2005, 14:06:52
    #32949575
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка вызова MenuItemFromPoint
Сейчас проверить не мпогу, но думается мне ByVal нужно оставить.

Magnus
...
Рейтинг: 0 / 0
07.03.2005, 18:03:23
    #32949704
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка вызова MenuItemFromPoint
Magnus23Сейчас проверить не мпогу, но думается мне ByVal нужно оставить.

Magnus
User-type не передается ByVal. Компилятор ругается. Я поэтому ByVal и убрал.
...
Рейтинг: 0 / 0
07.03.2005, 18:24:52
    #32949717
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка вызова MenuItemFromPoint
Все, разобрался методом "тыка". Magnus спасибо.
Нужно функцию объявлять по другому:
Код: plaintext
Public Declare Function MenuItemFromPoint Lib "user32.dll" (ByVal hWnd As Long, ByVal hMenu As Long, ByVal X As Long, ByVal Y As Long) As Long
и соответственно вызвать:
Код: plaintext
Debug.Print "Menu Item position:"; MenuItemFromPoint(ByVal hWnd&, GetMenu(ByVal hWnd&), ByVal PAPI.X, ByVal PAPI.Y)
...
Рейтинг: 0 / 0
07.03.2005, 20:27:23
    #32949782
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка вызова MenuItemFromPoint
Да вот то-то и оно :). Верно, не предаются, но я сам ее когда то юзал и было нечто подобное, да и где-то недавно обьявление этой функции видал, там тоже был ByVal на последнем параметре. Сидел и думал, у меня галюны или уже совсем забывать стал? :).

Но все равно, что то тут не здесь... POINTAPI должна передаваться по ссылке, прям так как обьявлена - ссылка на структуру.

Сделаем проще, поставь ByRef вместо ByVal. Если уж он тупой и не понимает что нужна ссылка... укажем.

Magnus
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ошибка вызова MenuItemFromPoint / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]