Marshalling Array of Single

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Marshalling Array of Single

    Hallo,
    ich arbeite mit einer DLL. Diese erwartet bei einer Funktion als Eingabeparameter ein Array of Pointer.
    Diese Pointer wiederum zeigen auf verschiedene Arrays.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „chrissfuwa“ ()

    Der Aufruf sieht hierbei wie folgt aus:

    measure(0) = Pointer auf Array a
    measure(1) = Pointer auf Messung 1
    measure(2) = Pointer auf Messung 2
    ............
    measure(n) = Pointer auf Messung n


    blublablo(ipar,dpar,measure)

    Wenn ich versuche in die Funktion ein Array mit Werten zu geben kommt:

    ""parameter 3" kann nicht gemarshallt werden: Für geschachtelte Arrays ist keine Marshallunterstützung vorhanden."
    @chrissfuwa: Und so was:

    VB.NET-Quellcode

    1. Dim aa() As IntPtr = {IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero}
    natürlich mit Deinen Pointern
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    @chrissfuwa: Und so was:

    VB.NET-Quellcode

    1. Dim aa() As IntPtr = {IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero}
    natürlich mit Deinen Pointern

    Ich habe mich leider undeutlich ausgedrückt. Wie ich das Array an sich erstelle ist mir klar. Aber wie komme ich an die IntPtr beispielsweise eines Arrays (oder eines Elements eines Arrays) heran.

    Bsp:

    Ich habe ein Array(...Daten, Daten, Daten,...) und möchte hiervon den IntPtr

    Kangaroo schrieb:

    chrissfuwa schrieb:

    Ich habe ein Array(...Daten, Daten, Daten,...) und möchte hiervon den IntPtr

    Ganz einfach: Du übergibst das Array, .NET marshaled daraus eh den Pointer.
    Wenn ich das Array übergebe kommt:

    ""parameter 3" kann nicht gemarshallt werden: Für geschachtelte Arrays ist keine Marshallunterstützung vorhanden."

    Die DLL erwartet ein Array()() As Single
    Deren INhalt Pointer auf Arrays sind

    chrissfuwa schrieb:

    und möchte hiervon den IntPtr

    RodFromGermany schrieb:

    Sieh Dir mal dieses Tut an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @chrissfuwa: Bitte unterlasse das vollständige Zitieren von Postings direkt über deinem. Zudem macht es keinen Sinn, sogar dein eigenes Posting nochmal zu zitieren.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Inzwischen habe ich folgendes gemacht:

    VB.NET-Quellcode

    1. 'Pointer auf Array
    2. Dim triggData As GCHandle = GCHandle.Alloc(triggDataArr, GCHandleType.Pinned)
    3. Dim triggDataPtr As System.Intptr = triggData.AddrOfPinnedObject
    4. 'Array of Ptr, auf das ein Ptr zeigt
    5. Dim fparMeasData(0 To measData.length)() As Single
    6. Dim measDataGCH As GCHandle
    7. Dim measDataPtrArr(0 To measData.Length -1) As System.Intptr
    8. for cnt As Integer = 0 To measData.length -1
    9. lockMeasData = GCHandle.Alloc(fparMeasData(cnt), GCHandleType.Pinned)
    10. fparMeasData(cnt) = lockMeasData.AddrOfPinnedObject
    11. Next
    12. 'Pointer auf das Array of Pointer
    13. Dim fparMeasDataArr As GCHandle = GCHandle.Alloc(fparMeasData, GCHandleType.Pinned)
    14. Dim fparMeasDataArrPtr As System.Intptr = fparMeasDataArr.AddrOfPinnedObject


    Ist die Vorgehensweise so korrekt? Gibt es bessere Wege ?

    Es kommt die Meldung, dass der Einstiegspunkt der Methode nicht in der
    DLL gefunden werden konnte. Dies heißt wiederum, dass die
    Übergabeparamerter so nicht stimmen....

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „chrissfuwa“ ()

    @chrissfuwa: Lernresistent?

    RodFromGermany schrieb:

    Sieh Dir mal dieses Tut an.
    Musste halt die Member einzeln befüllen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Noch mal zur Auffrischung:
    Was willst Du in .NET übergeben,
    was erwartet die DLL?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die DLL Funktion sieht wie folgt aus:

    blablublo(int *ipar, double *dpar, double *fptr
    [1...n Elemente, welche Arrays Of Double sind])

    ipar ist ein array, dpar ist ein array und fptr ist ein mehrdimensionales array

    Mit:

    VB.NET-Quellcode

    1. Try
    2. Dim lockIpar As GCHandle = GCHandle.Alloc(ipar, GCHandleType.Pinned)
    3. Dim IparPtr As System.IntPtr = lockIpar.AddrOfPinnedObject
    4. Catch ex As Exception
    5. ... arbeite damit....
    6. Finally
    7. lockIpar.Free()
    8. End Try

    erhalte ich einen Pointer auf das ipar Array (dasselbe in grün mit dem dpar Array).

    Aber bei dem Mehrdimensionalen Array kracht es...

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „chrissfuwa“ ()

    Hast Du die C-Quellen in Deiner Hand?
    -----
    Ohne das jetzt hier getestet zu haben.
    Mach Dir ein Array of IntPtr
    und weise jedem Array-Element den gemarshalten IntPtr auf die jeweilige Zeile zu.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Hast Du die C-Quellen in Deiner Hand?
    -----
    Ohne das jetzt hier getestet zu haben.
    Mach Dir ein Array of IntPtr
    und weise jedem Array-Element den gemarshalten IntPtr auf die jeweilige Zeile zu.
    Ja, die liegen vor. Doch ist der komplette Aufbau (Verarbeitung) auf diese Pointer ausgelegt.

    Wie ist das in .net funktionieren IntPtr auch mit Double oder sonstigen Werten (es gibt soweit ich gesehen habe keine DblPtr) .

    Du meinst also "Array of IntPtr" erstellen und dort für jedes Element einen Pointer holen und letztendlich den pointer auf das array übergeben?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „chrissfuwa“ ()

    IntPtr ist einfach ein Ding, das man nach C / C++ mit void* übersetzen kann. Mach also einfach einen Pointer auf ein Array auf Pointer und los.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mach mal bitte ein kleines Testprojekt, das will ich mir mal ansehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!