Passer un pointeur null en parametre

mmattler Messages postés 5 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 janvier 2008 - 9 janv. 2008 à 22:56
mmattler Messages postés 5 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 janvier 2008 - 10 janv. 2008 à 23:06
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

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
10 janv. 2008 à 00:39
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
0
mmattler Messages postés 5 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 janvier 2008
10 janv. 2008 à 07:24
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
0
Utilisateur anonyme
10 janv. 2008 à 09:44
Salut,

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







__________
  Kenji
0
mmattler Messages postés 5 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 janvier 2008
10 janv. 2008 à 13:02
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
10 janv. 2008 à 13:07
Rien ne t'empêche de faire deux fois la déclaration de l'api avec des arguments de type différents.

__________
  Kenji
0
mmattler Messages postés 5 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 janvier 2008
10 janv. 2008 à 18:38
c'est justement ce que je voulais eviter, parce que je n'ai montré qu'une API, mais il y en  a d'autre....
0
Utilisateur anonyme
10 janv. 2008 à 19:46
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
0
mmattler Messages postés 5 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 janvier 2008
10 janv. 2008 à 23:06
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
0
Rejoignez-nous