locked
[VB2008] Comment évaluer la taille (nb d'octets) d'une Structure RRS feed

  • Question

  • Bonjour,

    En Vb6, j'évaluais le nombre d'octets de mon Type avec la fonction VBA.Strings.LenB()

    Private Type tagInitCommonControlsEx
       lngsize As Long
       lngICC As Long
    End Type
    
    Dim iccex As tagInitCommonControlsEx
    iccex.lngsize = LenB(iccex)
    

    Comme il s'agit de Long Vb6, le résultat est bien sur 8 octets.

    En VbNet, mon Type est devenu une Structure.

    	Private Structure tagInitCommonControlsEx
    		Dim lngsize As Integer
    		Dim lngICC As Integer
    	End Structure
    



    Quelle fonction puis-je utiliser pour évaluer le nb d'octets de ma Structure ?

    L'aide précise qu'il faut utiliser l'espace de nom System.Text, mais le seul exemple que j'ai trouvé (http://social.msdn.microsoft.com/Forums/fr-FR/vbasicfr/thread/3cdad794-96c1-4c8e-8d6b-3fcc83239f1cdonne) donne le nb d'octets d'une chaine de carcatères (ou tableau de caractères), mais pas d'une variable ou d'une Structure.

    J'ai cherché aussi SizeOf, sans succès...

    Quelqu'un connait-il la bonne syntaxe ?


    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    jeudi 2 juillet 2009 13:59

Réponses

Toutes les réponses

  • Bonjour,

    Avez vous essayé Marshal.SizeOf() ?
    http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.sizeof.aspx

    Pouvez-vous nous indiquer pourquoi vous avez besoin de la taille de cette structure ?

    Cordialement
    Gilles TOURREAU - MVP C#
    • Marqué comme réponse Golard vendredi 3 juillet 2009 08:21
    jeudi 2 juillet 2009 19:26
  • Bonjour Gilles,

    J'utilise LenB() pour initialiser le contrôle SGrid 2.0.
    Voici un extrait du code Vb6 avant mise à niveau vbNet:

    '-----------------------------------------------------------------------------------------------------------------------------------------------------
    'Owner-draw Cells with SGrid 2.0
    '-----------------------------------------------------------------------------------------------------------------------------------------------------
    Private Type tagInitCommonControlsEx
       lngsize As Long
       lngICC As Long
    End Type
    Private Declare Function InitCommonControlsEx Lib "comctl32.dll" (iccex As tagInitCommonControlsEx) As Boolean
    Private Const ICC_USEREX_CLASSES = &H200
    
    
        'we need to call InitCommonControls before we can use XP visual styles.
        'Here I'm using InitCommonControlsEx, which is the extended version provided in v4.72 upwards
        '(you need v6.00 or higher to get XP styles)
        On Error Resume Next
        'this will fail if Comctl not available
        Dim iccex As tagInitCommonControlsEx
        iccex.lngsize = LenB(iccex)
        iccex.lngICC = ICC_USEREX_CLASSES
        Call InitCommonControlsEx(iccex)
    


    La fonction System.Runtime.InteropServices.Marshal.SizeOf() semble fonctionner parfaitement.
    J'ai remplacé la ligne avec LenB() par:

    iccex.lngsize = System.Runtime.InteropServices.Marshal.SizeOf(iccex)

    Je me demande ce que renvoit cette fontion quand la Structure VbNet contient des méthodes (Sub) définies entre Structure et End Structure... 

    Merci en tout cas pour cette solution,

    Cordialement,
    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    • Modifié Golard vendredi 3 juillet 2009 08:24 rajout ligne de code oubliée
    vendredi 3 juillet 2009 08:21
  • Bonjour,

    Pour information, la notion de taille pour les méthodes de classe et de structure n'existe pas en .NET. Donc, Marshal.SizeOf() ne tient pas compte des méthodes.

    Cordialement
    Gilles TOURREAU - MVP C#
    samedi 4 juillet 2009 07:12
  • Bonjour,

    Pour information, la notion de taille pour les méthodes de classe et de structure n'existe pas en .NET. Donc, Marshal.SizeOf() ne tient pas compte des méthodes.

    Cordialement
    Gilles TOURREAU - MVP C#

    Bonjour,

    Ok, je comprends que Marshal.SizeOf() ne calcul que la taille des variables statiques.

    Pour conclure sur Marshal.SizeOf() , j'imagine que les tableaux non dimensionnés ou les chaînes de caractères ne sont pas non plus évaluées ?

    Par exemple:

    Public Structure DriveInfo
       Dim DriveNumber() As Short
       Dim DriveType As String
       Dim byti As Byte
    End Structure
    


    Dans ce cas, Marshal.SizeOf() doit donner 1 octet pour le Byte et ignorer les variables "indéfinies" ?

    Cordialement,

    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    lundi 6 juillet 2009 07:32
  • Bonjour,

    Qu'est ce que pour vous les variables "indéfinies" ?

    Cordialement
    Gilles TOURREAU - MVP C#
    mardi 7 juillet 2009 19:46
  • Bonjour,

    Qu'est ce que pour vous les variables "indéfinies" ?

    Cordialement
    Gilles TOURREAU - MVP C#

    Désolé le mot "indéfinies" est effectivement mal choisi !

    Je voulais dire "indéfinies en taille": le tableau DriveNumber() As Short non dimensionné et la chaine DriveType As String dont la taille dépendra du nombre de caractères de la chaine.

    C'est pourquoi dans l'exemple précédent, je supposais que seul byti As Byte pouvait avoir une taille évaluée par la fonction Marshal.SizeOf(), à savoir 1 octet...

    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    mercredi 8 juillet 2009 07:27
  • Bonjour,

    Les chaînes de caractères sont des références (pointeurs plus techniquement). Donc leur longueur n'ont pas d'incidence sur la taille des structures.

    Cordialement
    Gilles TOURREAU - MVP C#
    dimanche 26 juillet 2009 12:38