IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Nothing passé en parametre par reference n'est pas un pointeur null


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Nothing passé en parametre par reference n'est pas un pointeur null
    Bonjour à tous,

    Je suis en train de developper une application en vb.net qui utilise les api du stockage amovible (ntmsapi.dll). pour une enumeration des objets du stockage amovible, je dois appeler une premiere fois l'api enumeratentmsobject avec un pointeur null, puis ensuite avec un pointeur sur une structure Guid.

    Quand je passe intptr.zero l'api marche au 1er appel, mais je ne peux utiliser la declaration pour passer un pointeur sur la structure au second appel

    Quand je passe nothing en pensant passer un pointeur null , j'ai l'erreur 4312 au 1er appel



    Vous avez le code joint ....

    Où est l'erreur ?

    Comment passer un pointeur null ?

    ou comment declarer l'api sur la fonction ?

    Merci à tous



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    Imports System.Runtime.InteropServices
    '**********************************************************************************************
    ' changer la chaine de la version pour executer avec la 2ème version de l'API qui pose problème
    '**********************************************************************************************
    #Const version = "V1"
     
    Public Class Form1
     
        Public Enum NtmsObjectsTypes
            NTMS_UNKNOWN = 0
            NTMS_OBJECT
            NTMS_CHANGER
            NTMS_CHANGER_TYPE
            NTMS_COMPUTER
            NTMS_DRIVE
            NTMS_DRIVE_TYPE
            NTMS_IEDOOR
            NTMS_IEPORT
            NTMS_LIBRARY
            NTMS_LIBREQUEST
            NTMS_LOGICAL_MEDIA
            NTMS_MEDIA_POOL
            NTMS_MEDIA_TYPE
            NTMS_PARTITION
            NTMS_PHYSICAL_MEDIA
            NTMS_STORAGESLOT
            NTMS_OPREQUEST
            NTMS_NUMBER_OF_OBJECT_TYPES
        End Enum
     
        <StructLayout(LayoutKind.Explicit, Size:=16)> _
        Public Structure NTMS_GUID
            <FieldOffset(0)> Public Data1 As UInt32
            <FieldOffset(4)> Public Data2 As UShort
            <FieldOffset(6)> Public Data3 As UShort
            <FieldOffset(8)> Public Data41 As Byte
            <FieldOffset(9)> Public Data42 As Byte
            <FieldOffset(10)> Public Data43 As Byte
            <FieldOffset(11)> Public Data44 As Byte
            <FieldOffset(12)> Public Data45 As Byte
            <FieldOffset(13)> Public Data46 As Byte
            <FieldOffset(14)> Public Data47 As Byte
            <FieldOffset(15)> Public Data48 As Byte
        End Structure ' NTMS_GUID
     
        Declare Ansi Function OpenNtmsSessionA Lib "ntmsapi.dll" (<MarshalAs(UnmanagedType.LPStr)> ByVal LpServer As String, _
                                                                  <MarshalAs(UnmanagedType.LPStr)> ByVal LpApp As String, _
                                                                  ByVal dwOptions As Integer) As Integer
     
        ' 2 versions d'appel différents pour la même API
        ' la version "V1" permet de passer un pointeur null à l'API
        ' la version "V2" passe un pointeur sur une structure
    #If Version = "V1" Then
        Declare Function EnumerateNtmsObject Lib "ntmsapi.dll" (ByVal hSession As Integer, _
                                                                   ByVal lpContainerId As IntPtr, _
                                                                   ByRef lpList As NTMS_GUID, _
                                                                   ByRef lpdwListSize As Integer, _
                                                                   ByVal dwType As Integer, _
                                                                   ByVal dwOptions As Integer) As Integer
    #Else
        Declare Function EnumerateNtmsObject Lib "ntmsapi.dll" (ByVal hSession As Integer, _
                                                                   ByRef lpContainerId As NTMS_GUID, _
                                                                   ByRef lpList As NTMS_GUID, _
                                                                   ByRef lpdwListSize As Integer, _
                                                                   ByVal dwType As Integer, _
                                                                   ByVal dwOptions As Integer) As Integer
    #End If
     
        Declare Function CloseNtmsSession Lib "ntmsapi.dll" (ByVal hSession As Integer) As Integer
     
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim G1 As New NTMS_GUID
            Dim Hdle As Integer, NbObjet As Integer, ResultAPI As Integer
            Dim T() As NTMS_GUID
     
     
            NbObjet = 10
            Hdle = 0
            Hdle = OpenNtmsSessionA(Nothing, Nothing, 0)
     
            If Hdle = -1 Then
                MsgBox("service stockage amovible non démarré !", MsgBoxStyle.Critical, "Stop")
                Exit Sub
            End If
     
            MsgBox("Handle OpenNtmsSession = " & Hdle)
            ReDim T(NbObjet - 1)
     
            '***********************************************************************
            ' il semblerait que nothing en tant que variable passée en paramètre par référence 
            ' ne soit pas un pointeur NULL
    #If Version = "V1" Then
            Dim P As IntPtr
            P = IntPtr.Zero
            ResultAPI = EnumerateNtmsObject(Hdle, P, T(0), NbObjet, NtmsObjectsTypes.NTMS_LIBRARY, 0)
    #Else
            ResultAPI = EnumerateNtmsObject(Hdle, Nothing, T(0), NbObjet, NtmsObjectsTypes.NTMS_LIBRARY, 0)
    #End If
            '************************************************************************
     
            If ResultAPI = 0 Then
                MsgBox("resultat EnumerateNtmsObject OK !")
            Else
                MsgBox("resultat EnumerateNtmsObject = " & ResultAPI)
            End If
     
            ResultAPI = CloseNtmsSession(Hdle)
     
        End Sub
     
     
    End Class

  2. #2
    Membre expérimenté

    Homme Profil pro
    kiné passionné de dev
    Inscrit en
    Mars 2006
    Messages
    1 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : kiné passionné de dev

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 570
    Points : 1 738
    Points
    1 738
    Billets dans le blog
    1
    Par défaut
    pour passer une valeur nulle, tu a un truc du genre
    Petit poulain devient grand de jour en jour...

    Petit Poulain, ce n'est que pour les intimes!

  3. #3
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 175
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 175
    Points : 1 767
    Points
    1 767
    Par défaut
    Bonjour.

    J'aurai plutôt tenté un intptr.zero

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Quand je passe intptr.zero l'api marche au 1er appel, mais je ne peux utiliser la declaration pour passer un pointeur sur la structure au second appel
    En fait tu peux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Dim id as NTMS_GUID = ...
    ' allocation de 16 octets (taille de la structure GUID) de mémoire non managée
    Dim P As IntPtr = Marshal.AllocHGlobal(16)
    ' copie de la structure dans ce bloc de mémoire
    Marshal.StructureToPtr(id, P, True)
    ' appel de la fonction avec l'adresse de la structure non managée
    ResultAPI = EnumerateNtmsObject(Hdle, P, T(0), NbObjet, NtmsObjectsTypes.NTMS_LIBRARY, 0)
    ' libération de la mémoire non managée
    Marshal.FreeHGlobal(P)
    Evidemment ce serait plus propre de pouvoir utiliser la structure NTMS_GUID directement, mais vu qu'une structure est un type valeur et ne peut donc pas être Nothing, je ne vois pas trop comment faire... je crois qu'il y a quelques experts de l'interop sur developpez.com, il faudrait qu'ils fassent un tour sur ce topic !

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Poulain Voir le message
    pour passer une valeur nulle, tu a un truc du genre
    en fait ça n'a rien à voir avec l'interop, c'est utilisé pour représenter une valeur NULL dans une base de donnée

Discussions similaires

  1. [Integration] Spring remoting: Parametres par reference ou par valeur ?
    Par Yiempia dans le forum Spring
    Réponses: 0
    Dernier message: 24/01/2013, 12h28
  2. Passage de parametre par reference dans un array
    Par h_m_m_7 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 05/04/2010, 00h52
  3. Réponses: 3
    Dernier message: 13/02/2008, 16h07
  4. Réponses: 1
    Dernier message: 25/10/2006, 11h13
  5. Réponses: 1
    Dernier message: 07/09/2006, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo