3 votes

VB.net Passer une structure à une dll non gérée

Je suis en train de migrer du code VB6 vers VB.net, le code contient une structure qui contient des tableaux 1d, des tableaux 2d, et quelques autres variables.

Le schéma général de la structure de Vb.net est le suivant

Public Structure Test

    Dim a As Single
    Dim b As Single
    Dim c As Single
    <VBFixedArray(2)> Dim arr1() As Single
    <VBFixedArray(2, 2)> Dim mdarr1(,) As Single
    <VBFixedArray(4)> Dim arr2() As Byte
    <VBFixedArray(4)> Dim arr3() As Short
    <VBFixedArray(3, 2)> Dim mdarr2(,) As Integer

    Dim d As Integer
    Dim e As Decimal

End Structure

L'appel à la dll est déclaré comme suit

Public Declare Sub getState Lib "val.dll" (ByRef state As Test)

Ailleurs sur ce site, j'ai réalisé que nous devons "marshal" la structure pour lui permettre d'être compatible avec le code non géré qui est sur le point de l'accepter.

Cependant, je reçois toujours des erreurs d'exécution lors de l'exécution du code, je n'ai aucune idée de la façon d'utiliser la fonction d'exécution de l'utilisateur. System.Runtime.InteropServices.Marshal classe.

Quelle serait la manière correcte de transmettre cette structure à la dll ?

EDIT :

Le type de données original de VB6 est

Public Type Test

    a As Single
    b As Single
    c As Single
    arr1(0 To 2) As Single
    mdarr1(0 To 2, 0 To 2) As Single
    arr2(0 To 4) As Byte
    arr3(0 To 4) As Integer
    mdarr2(0 To 3, 0 To 2) As Long

    d As Long
    e As Currency

End Type

1voto

MarkJ Points 21438

Avez-vous le code source de getState dans le val.dll ? S'il est écrit en C ou C++, et que vous avez le code source ou même simplement les en-têtes, vous pouvez utiliser la fonction Assistant P/Invoke pour générer automatiquement votre code VB.Net.

Alternative... (et s'il vous plaît, postez la structure VB6 originale !)

  • Vous pouvez avoir besoin d'allouer les tableaux avant d'appeler getState par exemple state.arr1 = {0.0, 0.0} etc.
  • El Decimal variable e pourrait vous causer un problème. En VB6, c'était probablement un Currency variable, et Decimal n'est pas un équivalent exact, pour autant que je m'en souvienne. Il doit y avoir un moyen d'indiquer à VB.Net de l'organiser comme une devise. Peut-être en ajoutant un attribut comme ça...

Exemple de code :

 Imports System.Runtime  
 Public Structure Test  
   ''blah blah

   <InteropServices.MarshalAs(InteropServices.UnmanagedType.Currency)> _  
   Dim e As Decimal  

   ''blah blah

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X