>
Поки це виглядає дуже схоже на підхід вільних потоків. Ви створюєте екземпляр класу і передаєте його функції, яка запускає фоновий потік. В модулі modMTBack з'являється наступний код:
'Structure to hold IDispatch GUID
Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4 (7) As Byte
End Type
Public IID_IDispatch As GUID
Declare Function CoMarshalInterThreadInterfaceInStream Lib _
"ole32.dll" (riid As GUID, ByVal pUnk As IUnknown, _
ppStm As Long) As Long
Declare Function CoGetInterfaceAndReleaseStream Lib _
"ole32.dll" (ByVal pStm As Long, riid As GUID, _
pUnk As IUnknown) As Long
Declare Function CoInitialize Lib "Ole32.dll" (ByVal _
pvReserved As Long) As Long
Declare Sub CoUninitialize Lib "ole32.dll" () p> 'Start the background thread for this object
'using the apartment model
'Returns zero on error
Public Function StartBackgroundThreadApt (ByVal qobj As clsBackground)
Dim threadid As Long
Dim hnd &, res &
Dim threadparam As Long
Dim tobj As Object
Set tobj = qobj
'Proper marshaled approach
InitializeIID
res = CoMarshalInterThreadInterfaceInStream (IID_IDispatch, qobj, threadparam)
If res 0 Then
StartBackgroundThreadApt = 0
Exit Function
End If
hnd = CreateThread (0, 2000, AddressOf BackgroundFuncApt, threadparam, 0, threadid)
If hnd = 0 Then
'Return with zero (error)
Exit Function
End If
'We don't need the thread handle
CloseHandle hnd
StartBackgroundThreadApt = threadid
End Function
Функція StartBackgroundThreadApt трохи складніша ніж її еквівалент при застосуванні підходу вільних потоків. Перша нова функція називається InitializeIID. Вона має наступний код:
'Initialize the GUID structure
Private Sub InitializeIID ()
Static Initialized As Boolean
If Initialized Then Exit Sub
With IID_IDispatch
. Data1 = & H20400
. Data2 = 0
. Data3 = 0
. Data4 (0) = & HC0
. Data4 (7) = & H46
End With
Initialized = True
End Sub
Ви бачите, нам необхідний ідентифікатор інтерфейсу - 16 байтовая структура, яка унікально визначає інтерфейс. Зокрема нам необхідний ідентифікатор інтерфейсу для інтерфейсу IDispatch (детальна інформація щодо IDispatch може бути знайдена в моїй книзі Developing ActiveX Components). Функція InitializeIID просто ініціалізує структуру IID_IDISPATCH до коректним значенням для ідентифікатора інтерфейсу IDispatch. Значення Це значення виходить за допомогою використання утиліти перегляду системного реєстру.
Чому нам необхідний цей ідентифікатор?
Тому що, щоб твердо дотри...