COM Standard Interfaces: IUnknown and IDispatch
So far you have seen how interfaces are
represented in memory and what an object like CChecking looks like in
memory when it has a single interface, the default interface.
Let’s shift now to the case in which a developer adds
functionality to the CChecking class by defining another interface,
IAccount, and implementing the interface in the
object. The following code shows how a developer might do this:
' Class IAccount
Option Explicit
Public Property Get Balance( ) As Currency
End Property
Public Sub MakeDeposit(ByVal Amount As Currency)
End Sub
' Class CChecking
Option Explicit
Implements IAccount
Private m_cBalance As Currency
Private Property Get IAccount_Balance( ) As Currency
Balance = m_cBalance
End Property
Private Sub IAccount_MakeDeposit(ByVal Amount As Currency)
m_cBalance = m_cBalance + Amount
End SubThe client code using this code would look like the following:
Dim Acct As IAccount Set Acct = new CChecking Call Acct.MakeDeposit(5000) Set Acct = Nothing
What VB does in this case is a little different. When the object is
allocated in memory on the server side, VB builds two vtables. One
vtable contains the public members of the
_CChecking default interface. As it is right now,
there are no public functions in CChecking. Nonetheless, if there
were, then they would be part of a vtable. When VB sees the
Implements statement in the server code, VB
allocates a separate vtable to contain the public functions for the
IAccount interface. ...