powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ошибка вызова MenuItemFromPoint
5 сообщений из 5, страница 1 из 1
Ошибка вызова MenuItemFromPoint
    #32949530
МаксимВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При вызове функции 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
Ошибка вызова MenuItemFromPoint
    #32949575
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас проверить не мпогу, но думается мне ByVal нужно оставить.

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

Magnus
User-type не передается ByVal. Компилятор ругается. Я поэтому ByVal и убрал.
...
Рейтинг: 0 / 0
Ошибка вызова MenuItemFromPoint
    #32949717
МаксимВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, разобрался методом "тыка". 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
Ошибка вызова MenuItemFromPoint
    #32949782
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да вот то-то и оно :). Верно, не предаются, но я сам ее когда то юзал и было нечто подобное, да и где-то недавно обьявление этой функции видал, там тоже был ByVal на последнем параметре. Сидел и думал, у меня галюны или уже совсем забывать стал? :).

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

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

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


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