Я использую VBControlExtender
в качестве типа параметра
Public Sub SomeMethod(someControl as VBControlExtender)
тогда я получаю такие ссылки
Dim someSpecificControl as SpecificControl
Dim someSpecificControlExt as VBControlExtender
Set someSpecificControl = someControl.object
Set someSpecificControlExt = someControl
Затем используйте someSpecificControlExt
для доступа к Left
, TabIndex
, TabStop
, Name
, Move
и т. Д. Свойств расширителя и someSpecificControl
для доступа к определенным методам / свойствам моего пользовательского элемента управления. .
К вашему сведению, поведение вашего кода зависит от того, реализован ли пользовательский элемент управления в текущем проекте или на который имеется ссылка в ocx. Я использую Мэтт Керлендс также взломать доступ для прямого контроля пользователя , что позволяет мне сделать это
Dim someSpecificControl as DirectSpecificControl
, так что someSpecificControl
реквизиты / методы доступны с ранним ограничением.
Вот как я получаю someSpecificControlExt
(расширитель) от элемента управления:
Public Function GetExtendedControl(oCtl As IUnknown) As VBControlExtender
Dim pOleObject As IOleObject
Dim pOleControlSite As IOleControlSite
On Error Resume Next
Set pOleObject = oCtl
Set pOleControlSite = pOleObject.GetClientSite
Set GetExtendedControl = pOleControlSite.GetExtendedControl
On Error GoTo 0
End Function
Вот как я получаю внутренний UserControl
пользовательского элемента управления VB6:
Public Function GetUserControl(oObj As Object) As UserControl
Dim pControl As UserControl
Call CopyMemory(pControl, ObjPtr(oObj), 4)
Set GetUserControl = pControl
Call CopyMemory(pControl, 0&, 4)
End Function
Ссылка GetUserControl
Return имеет очень странную реализацию QueryInterface
- похоже, интерфейс UserControl
специально указан в E_NOTIMPLEMENTED
.