Ошибка в kernel32.dll при использовании OCX с SubClasser'ом

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Ошибка в kernel32.dll при использовании OCX с SubClasser'ом

Сообщение lister » 23.03.2006 (Чт) 23:56

Столкнулся со следующей трудностью...

Есть проект ActiveX Control. В нем модуль и два класс-модуля от сабклассера плюс один юзер-контрол - Button

Возникает довольно-таки неприятная ситуация...

Компилирую OCX, добавляю его для тестирования в голый проект Standart EXE, компилирую Project1.exe, запускаю, закрываю. После закрытия Project1.exe появляется ошибка в kernel32.dll

Пол-головы сломал. Вторую доламывать боюсь :)

Код контрола:

Код: Выделить всё
Option Explicit

Implements ISubclass

Private Type tagTRACKMOUSEEVENT
  cbSize As Long
  dwFlags As Long
  hwndTrack As Long
  dwHoverTime As Long
End Type

Private Const TME_HOVER As Long = 1
Private Const TME_LEAVE As Long = 2

Private Const WM_MOUSEHOVER As Long = &H2A1
Private Const WM_MOUSELEAVE As Long = &H2A3
Private Const WM_MOUSEMOVE As Long = &H200

Private Declare Function SetProp Lib "user32.dll" Alias "SetPropA" ( _
   ByVal hWnd As Long, _
   ByVal lpString As String, _
   ByVal hData As Long) As Long
   
Private Declare Function GetProp Lib "user32.dll" Alias "GetPropA" ( _
   ByVal hWnd As Long, _
   ByVal lpString As String) As Long
   
Private Declare Function RemoveProp Lib "user32.dll" Alias "RemovePropA" ( _
   ByVal hWnd As Long, _
   ByVal lpString As String) As Long

Private Declare Function TrackMouseEvent Lib "user32.dll" ( _
   ByRef lpEventTrack As tagTRACKMOUSEEVENT) As Long

Public Event MouseHover()
Public Event MouseLeave()

Private Function ISubclass_Callback(ByVal hWnd As Long, uMsg As Long, wParam As Long, lParam As Long, ByVal PrevProc As Long) As Long
  Dim typTME As tagTRACKMOUSEEVENT
 
  Select Case uMsg
    Case WM_MOUSEHOVER
      SetProp hWnd, "Hot", 1
      RaiseEvent MouseHover

    Case WM_MOUSELEAVE
      RemoveProp hWnd, "Hot"
      RaiseEvent MouseLeave

    Case WM_MOUSEMOVE
      If GetProp(hWnd, "Hot") = 0 Then
         typTME.cbSize = LenB(typTME)
         typTME.hwndTrack = hWnd
         typTME.dwFlags = TME_HOVER Or TME_LEAVE
         typTME.dwHoverTime = 1

         TrackMouseEvent typTME

      End If
 
  End Select
 
  If PrevProc Then _
      ISubclass_Callback = SubClasser.CallWindowProc(PrevProc, hWnd, uMsg, wParam, lParam)


End Function

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  If Ambient.UserMode Then _
      SubClasser.AddSubclassHook hWnd, Me, DoNotTransfer

End Sub

Private Sub UserControl_Terminate()
  SubClasser.RemoveAll

End Sub

Public Property Get hWnd() As Long
  hWnd = UserControl.hWnd
 
End Property

Public Property Get hdc() As Long
  hdc = UserControl.hdc
 
End Property

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.03.2006 (Пт) 7:58

Во дают...
Зачем тебе вместо обычных свойств GetProp и SetProp?
Изображение

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 24.03.2006 (Пт) 8:12

Наличие или отсутствие GetProp и SetProp на ошибку никак не влияет.

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 25.03.2006 (Сб) 0:46

Ну что... мэтрам ответить нечего? :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.03.2006 (Сб) 5:36

Не знаю, у меня работает - SP6 поставь на VB, разве что...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 25.03.2006 (Сб) 10:47

Продолжение темы:
http://bbs.vbstreets.ru/viewtopic.php?t=27600


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 194

    TopList