2010-04-27 10 views
5

Ich habe eine Reihe von VBA-Klassen in einer MS Access-Datenbank. Ich habe eine XML-Zeichenfolge mit Daten, mit denen ich neue Klassen erstellen möchte.XML-Deserialisierung in VB/VBA

Gibt es neben der individuellen Einstellung jeder Eigenschaft eine einfache Möglichkeit, die XML in mein Objekt zu deserialisieren?

Ich habe den Code mit der TypeLib Bibliothek gesehen

Public Sub ISerializable_Deserialize(xml As IXMLDOMNode) 

    Dim tTLI As TLIApplication 
    Dim tInvoke As InvokeKinds 
    Dim tName As String 
    Dim tMem As MemberInfo 

    tInvoke = VbLet 

    For Each tMem In TLI.ClassInfoFromObject(Me).Members 

    tName = LCase(tMem.Name) 

    CallByName Me, tMem.Name, VbLet, xml.Attributes.getNamedItem(tName).Text 

    Next tMem 
End Sub 

aber dies scheint nicht mit den Standard-Klassenmodulen zu arbeiten. Ich erhalte einen Fehler 429:

ActiveX Component Cannot Be Created 

Kann mir noch jemand helfen? Ich würde lieber nicht jedes Stück von Hand setzen müssen, wenn ich es helfen kann, einige dieser Klassen sind riesig!

Antwort

2

Sie nie Instanz tTLI in diesem Code & und später darauf beziehen, wie nur TLI so es wird nicht funktionieren, die 429 Fehler sein kann, weil die Typeinfo-Bibliothek nicht registriert ist, haben Sie es als Referenz hinzufügen?

Wenn ja folgendes funktioniert:

Dim TLI As TLIApplication 
Dim II As InterfaceInfo 
Dim MI As MemberInfo 

Set TLI = New TLIApplication 
Set II = TLI.InterfaceInfoFromObject(Me) 

For Each MI In II.Members 
    If MI.InvokeKind = InvokeKinds.INVOKE_PROPERTYPUT Then 
     Debug.Print MI.Name 
     TLI.InvokeHook Me, MI.Name, InvokeKinds.INVOKE_PROPERTYPUT, "PROPVALUE" 
    End If 
Next 

Sie können InvokeHook mit CallByName ersetzen, wenn Sie es wünschen.

+0

Private Klassen in einer Access-Datenbank sind in keiner öffentlichen Typbibliothek enthalten, daher glaube ich nicht, dass dies jemals funktioniert, selbst wenn die Tippfehler wie vorgeschlagen korrigiert wurden. Ich glaube nicht, dass 'InterfaceInfoFromObject (Me)' erfolgreich sein kann, da die relevanten Schnittstellen für 'Me' nicht öffentlich sind. – MarkJ

+0

InterfaceInfoFromObject funktioniert über IDispatch :: GetTypeInfo(), die in Access für mich funktioniert .. wie ... wer weiß? –

+0

Danke Alex. Es funktioniert immer noch nicht, es ist auf der -Linie fehlgeschlagen. Set TLI = Neue TLIApplication Zeile jetzt mit dem gleichen Fehler. Ich habe die typelib-Referenz referenziert, (tlbinf32.dll) ist das die richtige? Ben. – oharab