Representing Objects as strings in VBA
I don't see anything ugly about your Cast module. If it was .Net I would use a Static (Shared) type class, and a standard *.bas module is roughly equivalent in VB6. It seems to have been the right move to me. 

What I do question is the usefulness of defaulting to the object's pointer as a string representation of it. Since VB6 supports default properties, I would take advantage of it. It's not exactly pretty, but perhaps a more useful representation of an object.

Private Function TryCastToString(x As Variant) As String
    On Error GoTo ErrHandler

    TryCastToString = CStr(x)

    Exit Function

ErrHandler:
    Const MethodNotSupportedError As Integer = 438

    If Err.Number = MethodNotSupportedError Then
        TryCastToString = "&amp;" &amp; ObjPtr(x)
    Else
        Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
    End If
End Function


Which would change this function:


Private Function DefaultObjectToString(ByVal x As Object) As String

    DefaultObjectToString = ObjectToString(x, cast.CArray(Array("&amp;" &amp; ObjPtr(x))))

End Function



Into this:

Private Function DefaultObjectToString(ByVal x As Object) As String

    DefaultObjectToString = ObjectToString(x, cast.CArray(Array(TryCastToString(x))))

End Function




This provides a much nicer string back. Consider a workbook with a value of "Hello!" in cell A1 and the following code.

Public Sub test()
    Debug.Print Cast.ToString(ThisWorkbook)
    Debug.Print Cast.ToString(Range("A1"))
End Sub


This would result in the following:


Workbook(&amp;2349672)
Range(Hello!)