none
Byte-Array aus .NET kann in COM (VBA) zwar gelesen, nicht aber zurückgeschrieben werden RRS feed

  • Frage

  • Guten Morgen alle miteinander,

    Ich erstelle mit VB.NET unter Visual Studio 2013 eine DLL, die in COM-Programmen, bspw. in Word-Macros, verwendet werden soll.

    Ein mit VB.NET definiertes Byte Array kann ich leider in VBA nur lesen, nicht aber zurückschreiben.

    Die Definition in VBA sieht wie folgt aus:

            Private _Blb As Byte() = Nothing
            Public Property Blb As Byte()
                Get
                    Return _Blb
                End Get
                Set(value As Byte())
                    _Blb = value
                    BlbLength = value.Length()
                End Set
            End Property


    In VBA eines Word-Macros greife ich auf diese Array wie folgt zu:

    Global NETBlb As New NT.Clss
    Dim Blb() As Byte
    Blb = NETBlb.Blb
    ...
    NETBlb.Blb = Blb
    ...
    
    

    NT.Class steht dabei beispielsweise für die in VB.NET definierte Klasse, die das Byte Array enthält. Das Lesen des Arrays mit Blb = NETBlb.Blb funktioniert.

    Das Schreiben mit NETBlb.Blb = Blb passiert schon gar nicht den Compiler, denn dieser bringt den Fehler

    Fehler beim Kompilieren:

    Funktion oder Schnittstelle kann nur eingeschränkt verwendet werden oder verwendet einen Typ der Automatisierung, der von Visual Basic nicht unterstützt wird

    Die Typen von Blb und NETBlb.Blb werden aber in VBA mit TypeName(Blb) und TypeName(NETBlb.Blb) identisch mit Byte() ausgegeben.

    Hat jemand eine Idee, woran ich scheitere und wie ich wieder meines Programmiererlebens froh werden könnte?

    Gruß, Werner


    WM

    Montag, 13. November 2017 07:09

Alle Antworten

  • Hallo Werner,

    Es ist erforderlich das Arrayargument mit "ByRef" zu deklarieren. Danach solltest Du wieder die .tlb-Datei generieren, wie in folgendem Thread beschrieben:
    Calling .NET methods from VB6 via COM visible DLL
    Die offizielle Dokumentation für den Fehler findest Du in folgendem Artikel:
    Function marked as restricted or uses a type not supported in Visual Basic

    Gruß,

    Ivan Dragov


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 14. November 2017 06:37
    Moderator
  • Guten Morgen Ivan,

    das, was Du geschrieben hast, klang einleuchtend und hoffnungsvoll. Aber leider hilft es mir nicht, wenn ich es richtig verstanden habe.

    Mit "Es ist erforderlich das Arrayargument mit 'ByRef' zu deklarieren." konntest Du aus meiner Sicht ja nur meinen, dass ich

    Set(value As Byte())

    ändere in

    Set(ByRef value As Byte())

    Woanders kommt das Array ja nicht als Argument vor, da ich ja nur direkte Eigenschaftszuweisungen mache wie

    NETBlb.Blb = Blb

    Leider funktioniert dies aber nicht, da ich beim Einfügen von ByRef einen Fehler bekomme:

    "Der Set-Parameter kann nicht als 'ByRef' deklariert werden."

    und

    "Der Set-Parameter muss denselben Typ wie die Eigenschaft haben, in der er sich befindet."

    Falls ich Dich richtig verstanden habe, wird es so also nicht gehen.

    Es sei denn, dass ich für das Zuweisen eine Routine schreibe, in der ich das Array als ByRef deklariere. Ich hatte aber gehofft, ohne solche Krücken auszukommen.

    Vielleicht gibt es noch eine Möglichkeit?

    Gruß, Werner


    WM

    Mittwoch, 15. November 2017 06:50