VarPtr für Strukturen

  • VB.NET
  • .NET 4.0

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

    VarPtr für Strukturen

    Hallo Forum,

    ich muss eine dll nutzen, die unter anderem wie folgt aussieht.

    VB.NET-Quellcode

    1. Private Declare Function DWGetChannelList Lib "DWDataReaderLib_stdcall" Alias "_DWGetChannelList@4" (ByRef channel_list As DWChannel()) As DWStatus ' function returnes the list of stored channels
    2. Public Structure DWChannel ' structure for Dewesoft channel
    3. Public index As Integer ' unique channel identifier
    4. <MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)>
    5. Public chName() As Char ' the name of a channel 'Name() is reserved, internal function
    6. <MarshalAs(UnmanagedType.ByValArray, SizeConst:=20)>
    7. Public unit() As Char ' the unit of a channel (value 20)
    8. <MarshalAs(UnmanagedType.ByValArray, SizeConst:=200)>
    9. Public description() As Char ' the description of a channel ( value 200)
    10. Public color As Integer ' specifies the color of a channel (unsigned int)
    11. Public array_size As Integer ' length of the array channel (normal array_size = 1)
    12. End Structure


    Im Prinzip funktioniert die Arbeit mit der dll. Also die anderen Funktionen kann man nutzen und sie geben auch das richtige zurück.

    Mein Problem ist, dass in VBA (wo ich Beispielcode habe) dieser Code funktionier:

    Visual Basic-Quellcode

    1. 'DWGetChannelListCount
    2. ChannelListCount = DWGetChannelListCount()
    3. ReDim ChannelList(ChannelListCount - 1)
    4. 'DWGetChannelList
    5. Status = DWGetChannelList(VarPtr(ChannelList(0)))


    Da man aber keinen VarPtr in VB.net nutzen kann, habe ich zwar Funktionen gefunden, die die Aufgabe übernehmen, die Funktionen arbeiten aber nicht mit den Struturen (sondern mit Objects/Integern/Short).

    VB.NET-Quellcode

    1. Public Function VarPtr(ByVal e As Object) As Integer
    2. Dim GC As GCHandle = GCHandle.Alloc(e, GCHandleType.Pinned)
    3. Dim GC2 As Integer = GC.AddrOfPinnedObject.ToInt32
    4. GC.Free()
    5. Return GC2
    6. End Function


    Kann mir einer sagen, wie das funktionieren kann?

    Vielen Dank schon mal vorab
    Tukuan
    @Tukuan Du musst hier mit Marshal arbeiten, dort kannst Du Pointer auf alle möglichen Speicherinhalte von und nach .NET handeln.
    Gugst Du hier.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Moin ihr zwei,

    vielen Dank.
    Hab es mit Marshal hinbekommen... Man was für ein Aufwand. <X
    Das kannte ich noch gar nicht...
    ErfinderDesRades: Ich meine es mit deiner Version probiert zu haben. Irgendwie ging es nicht. Aber ich weiß nicht warum...

    Gruß
    Tukuan

    Tukuan schrieb:

    was für ein Aufwand
    Gugst Du auch mal hier.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!