mmattler
Messages postés5Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention10 janvier 2008
-
9 janv. 2008 à 22:56
mmattler
Messages postés5Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention10 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"
<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
'***********************************************************************
' 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
mmattler
Messages postés5Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention10 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
mmattler
Messages postés5Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention10 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