VB Com object in Delphi

I have a colleague that has written a COM object in VB that I need to use
but I'm having a problem with it that seems to boil down to multiple
interfaces.  We extracted part of the object into two different objects and
removed a line from one that implements another interface.  The one with the
removed line works fine. The error I get is when I try to read a property -
I get an access violation in msvbvm60.dll.  My delphi code is :

procedure TForm1.Button1Click(Sender: TObject);
var
  Id: integer;
begin
  try
     MaritialStatus := CoMaritialStatus.Create;
     Id := 1;
     MaritialStatus.ID := Id;
     ShowMessage(IntToStr(MaritialStatus.Id));
  except
     on E: Exception do begin
        MessageDlg(E.Message, mtWarning, [mbOK], 0);
     end;
  end;
end;

The com object is imported as a type library and I'm using Delphi 5 Pro.
The VB code is below. If we remove the comment from 'Implements IDatabase I
get the access violation in Delphi.  Is there anything that I need to do in
Delphi to make this work? I have included the code for IDatabase if its of
use at the bottom.

Thanks in advance
Simon

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "MaritialStatus"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Option Explicit

'Implements IDatabase

Dim varPropNames(1) As Variant

Public Event RefreshControls()
Private Type UDTMarital_Status
   Key As String
   Description As String
   ID As Long
   IsNew As Boolean
   IsDirty As Boolean
   IsDeleted As Boolean
End Type

Private mudtProps As UDTMarital_Status
Private mblnLoading As Boolean

Private mvarparent As Long

Public Property Get Key() As String
   Key = mudtProps.Key
End Property

Friend Property Let Key(ByVal Value As String)
   mudtProps.Key = Value
End Property

Public Property Get Description() As String
   Description = mudtProps.Description
End Property

Public Property Let Description(ByVal Value As String)
   If Not mblnLoading Then mudtProps.IsDirty = True
   If Len(Value) > 30 Then Err.Raise vbObjectError + 100, , "Value Passed
Max Length"
   mudtProps.Description = Value
End Property

Public Property Get ID() As Long
   ID = mudtProps.ID
End Property

Public Property Let ID(ByVal Value As Long)
   If Not mblnLoading Then mudtProps.IsDirty = True
   mudtProps.ID = Value
End Property
Public Property Get IsNew() As Boolean
   IsNew = mudtProps.IsNew
End Property

Friend Property Let IsNew(ByVal Value As Boolean)
   mudtProps.IsNew = Value
End Property

Public Property Get IsDirty() As Boolean
   IsDirty = mudtProps.IsDirty
End Property

Friend Property Let IsDirty(ByVal Value As Boolean)
   mudtProps.IsDirty = Value
End Property

Public Property Get IsDeleted() As Boolean
   IsDeleted = mudtProps.IsDeleted
End Property

Friend Property Let IsDeleted(ByVal Value As Boolean)
   mudtProps.IsDeleted = Value
End Property

'
'
'
'Public Sub SetAsChild(obj As MaritialStatuses)
'   mvarparent = ObjPtr(obj)
'End Sub
'
'Friend Property Get Parent() As MaritialStatuses
'
'   Dim oParent As Object
'
'   CopyMemory oParent, mvarparent, 4
'   Set Parent = oParent
'   CopyMemory oParent, 0&, 4
'
'End Property
'
'Public Sub load(Optional ID As Long)
'
'   mblnLoading = True
'
'   goDB.Retrieve Me, "SELECT * FROM Marital_Status WHERE ID = " & ID,
stSQLStatment, rtFillObject
'
'   mudtProps.IsNew = False
'
'   RaiseEvent RefreshControls
'
'   mblnLoading = False
'
'End Sub
'
'Public Sub Update()
'
'   If mudtProps.IsDeleted Then
'
'      If Not mudtProps.IsNew Then
'         goDB.Execute Nothing, "DELETE * FROM Marital_Status WHERE ID = " &
mudtProps.ID, stSQLStatment, ertNone
'         Me.Parent.Remove mudtProps.ID
'      End If
'
'   ElseIf mudtProps.IsNew Or mudtProps.IsDirty Then
'
'      If mudtProps.IsNew Then
'         goDB.Save Me, "Marital_Status", stSQLStatment,
sqlExecInsertReturnIdentity, "ID=" & mudtProps.ID, "ID"
'      Else
'         goDB.Save Me, "Marital_Status", stSQLStatment, sqlExecUpdate,
"ID=" & mudtProps.ID, "ID"
'      End If
'
'      mudtProps.IsNew = False
'      mudtProps.IsDirty = False
'      mudtProps.IsDeleted = False
'
'   End If
'
'   RaiseEvent RefreshControls
'End Sub

Public Sub Delete()
   mudtProps.IsDeleted = True
End Sub

'Private Function IDatabase_GetPropertyNames() As Variant
'   IDatabase_GetPropertyNames = varPropNames
'End Function
'
'Private Sub IDatabase_SetPropertyNames(PropNames() As String)
''   varPropNames = PropNames()
'End Sub
'
'Private Sub IDatabase_load(Loading As Boolean)
'   mblnLoading = Loading
'   mudtProps.IsNew = False
'End Sub

Private Sub Class_Initialize()

   'Add Properties for CDatabase object
   varPropNames(0) = "ID"
   varPropNames(1) = "Description"

   Clear

End Sub

Public Sub Clear()
   With mudtProps
      .IsNew = True
      .IsDirty = False
      .IsDeleted = False
      .ID = 0
      .Description = ""
      .Key = ""
   End With
End Sub

IDatabase
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "IDatabase"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Option Explicit

'Used to create a list of property names for saveing called from retrieve
Public Function GetPropertyNames() As Variant
End Function

Public Sub SetPropertyNames(PropNames() As String)
End Sub

Public Sub load(Loading As Boolean)
End Sub