Passer un pointeur null en parametre

Signaler
Messages postés
5
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
10 janvier 2008
-
Messages postés
5
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
10 janvier 2008
-
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


 


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


 

8 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
salut,

euh... çà ne devrait pas être ResultAPI = EnumerateNtmsObject(Hdle, <strike>Nothing</strike> G1, T(0), NbObjet, NtmsObjectsTypes.NTMS_LIBRARY, 0)

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
5
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
10 janvier 2008

eh bien non, car G1 donne n' est pas un pointeur null mais l'adresse de la structure en mémoire meme si l'on fait G1 = nothing (donc pas initialisée)
Merci quand meme
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
Salut,

Un pointeur null en dotnet, c'est IntPtr.Zero







__________
  Kenji
Messages postés
5
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
10 janvier 2008

tu n'as pas regardé le code.
Mon problème est de passer 1er appel avec intptr.zero ensuite des appels avec un pointeur sur l'adresse d'une structure

Merci quand même
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
Rien ne t'empêche de faire deux fois la déclaration de l'api avec des arguments de type différents.

__________
  Kenji
Messages postés
5
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
10 janvier 2008

c'est justement ce que je voulais eviter, parce que je n'ai montré qu'une API, mais il y en  a d'autre....
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
C'est la mort d'avoir quelques lignes de code en plus ? Ton fichier à une taille limite ?

Bon, si tu y tiens, essaye avec System.Runtime.InteropServices.Marshal.StructureToPtr

__________
  Kenji
Messages postés
5
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
10 janvier 2008

ce n'est pas que c'est la mort, mais je préfère n'avoir qu'une déclaration par appel.
effectivevment
System.Runtime.InteropServices.Marshal.StructureToPtr
 et
System.Runtime.InteropServices.Marshal.PtrToStructure
semblent être les solutions. Merci