Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008
-
24 juin 2008 à 18:34
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 2018
-
2 juil. 2008 à 13:40
Bonjour à tous,
J'ai trouvé ce code sur le forum pour récupperer la numéro de série d'un disque dur.
Private Declare Function GetVolumeInformation Lib "kernel32.dll" _
Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, _
ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, _
ByVal lpVolumeSerialNumber As Long, ByVal lpMaximumComponentLength As Long, _
ByVal lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, _
ByVal nFileSystemNameSize As Long) As Long
Function NoSerieDisque(ByVal strDrive As String) As Long
Dim SerialNum As Long
Dim Res As Long
Dim Trucnull As Long
Dim Strnul As String
Res = GetVolumeInformation(strDrive, Strnul, Trucnull, SerialNum, Trucnull, Trucnull, Strnul, Trucnull)
Me.Text = strDrive
NoSerieDisque = SerialNum
End Function
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
MessageBox.Show(NoSerieDisque("C:"))
End Sub
J'ai une erreur, VB me dit que "Strnul" est utilisé avant qu'une valeur ne lui soit assignée !
Sinon, ce numéro change à chaque formattage non ? Y a t'il un numéro unique qui existe ? Quelqu'un a t'il un code pour le récupperer, moi je ne trouve que des trucs en VB6 !!!
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 24 juin 2008 à 18:41
Private Declare Function
GetVolumeInformation
Lib
"kernel32.dll"
_
Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, _
ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Integer, _
ByVal lpVolumeSerialNumber As Integer, ByVal lpMaximumComponentLength
As Integer,
_
ByVal lpFileSystemFlags As Integer, ByVal lpFileSystemNameBuffer
As String,
_
ByVal nFileSystemNameSize As Integer) As Integer
Function NoSerieDisque(ByVal strDrive As String) As Integer
Dim SerialNum As Integer
Dim Res As Integer
Dim Trucnull As Integer
Dim Strnul As String
Res = GetVolumeInformation(strDrive, Strnul, Trucnull, SerialNum,
Trucnull, Trucnull, Strnul, Trucnull)
Me.Text = strDrive
NoSerieDisque = SerialNum
End Function
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles
Button2.Click
MessageBox.Show (NoSerieDisque("C:"))
End Function
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 24 juin 2008 à 21:05
La vie est semée d'embûche et de soucis
Ne faisant pas de dot net, je ne risque pas d'aider, mais je tiens à rassurer les developpeurs en VB6, ce code fonctionne
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 24 juin 2008 à 21:10
et en bon dot netien que je ne suis pas, j'ai tout de même trouvé la solution, dans la déclaration d'API, rempalce
ByVal lpVolumeSerialNumber As Integer
par
ByRef lpVolumeSerialNumber As Integer
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 24 juin 2008 à 21:35
Public Class
Form1
Private Declare Function GetVolumeInformation Lib "kernel32.dll" _
Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, _
ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Integer, _
ByRef lpVolumeSerialNumber As Integer, ByVal lpMaximumComponentLength
As Integer,
_
ByVal lpFileSystemFlags As Integer, ByVal lpFileSystemNameBuffer
As String,
_
ByVal nFileSystemNameSize As Integer) As Integer
Function NoSerieDisque(ByVal strDrive As String) As Integer
Dim SerialNum As Integer
Dim Res As Integer
Dim Trucnull As Integer
Dim Strnul As String = Space$(255)
Res = GetVolumeInformation(strDrive, Strnul, 255, SerialNum, 0, Trucnull, Strnul, 255)
Me.Text = strDrive
Return SerialNum
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles
MyBase.Load
MessageBox.Show(NoSerieDisque("C:"))
End Sub
End Class
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 24 juin 2008 à 21:55
space
pas bon en VB.NET
(décoche la compatibilité, surprise ^^)
il faut un stringbuilder, et retyper l'API
ouai ouai "çà marche alors non merci"
bref
(je le dis aux lecteurs)
pense à valider la réponse de mortalino si tout roule
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 2 juil. 2008 à 13:10
*que la fonction SPACE vient de VB6
*que tu codes en VB.NET
=> qu'il ne faut donc pas utiliser SPACE
*que pour "générer" l'erreur pour s'en rendre compte, il faut décocher la ligne de compatibilité VB :
(ce pour tous les projets! je ne sais pas s'il y a une option/configuration pour que cette référence soit décochée par défaut)
*que le code est donc non pas avec un type String, mais System.Text.StringBuilder
exemple de code ici :
http://www.codyx.org/snippet_entrecouper-chaque-caractere-chaine-avec-autre-caractere_560.aspx#1765 *que l'API accepte directement la déclaration avec ce type, =
Private Declare Function GetVolumeInformation Lib "kernel32.dll" _
Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, _
ByVal lpVolumeNameBuffer As System.Text.StringBuilder,
ByVal nVolumeNameSize As Integer, _
ByRef lpVolumeSerialNumber As Integer,
ByVal lpMaximumComponentLength As Integer, _
ByVal lpFileSystemFlags As Integer,
ByVal lpFileSystemNameBuffer As System.Text.StringBuilder, _
ByVal nFileSystemNameSize As Integer) As Integer
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 2 juil. 2008 à 13:40
.... çà nous donne à peu près ci-dessous
(nb : je ne fais pas de dotnet, donc sous réserve mais çà doit être bon )
Private Declare Function GetVolumeInformation Lib "kernel32.dll" _
Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, _
ByVal lpVolumeNameBuffer As System.Text.StringBuilder, _
ByVal nVolumeNameSize As Integer, _
ByRef lpVolumeSerialNumber As Integer, _
ByVal lpMaximumComponentLength As Integer, _
ByVal lpFileSystemFlags As Integer, _
ByVal lpFileSystemNameBuffer As System.Text.StringBuilder, _
ByVal nFileSystemNameSize As Integer) As Integer
Function NoSerieDisque(ByVal strDrive As String) As Integer
Dim Buffer As New System.Text.StringBuilder(255)
Dim SerialNum As Integer
Dim iRet As Integer = GetVolumeInformation(strDrive, Buffer, Buffer.Capacity, SerialNum, 0, 0, Buffer, Buffer.Capacity)
If iRet = 0 Then Return 0 Else Return SerialNum
End Function
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim sDrive As String = "C:"
Dim sNum As Integer = NoSerieDisque(sDrive)
If sNum = 0 Then
MessageBox.Show("Recherche du Disque '" & sDrive & "' échouée")
Else
'sNum contient le numéro en DEC, on le veut en HEXA
Dim sRet As String = Microsoft.VisualBasic.Hex(sNum) 'pareil ici il doit y avoir plus approprié mais je ne connais pas
If sRet.Length = 8 Then
sRet = sRet.Substring(0, 4) & "-" & sRet.Substring(4, 4)
MessageBox.Show("Recherche du Disque '" & sDrive & "' : " & sNum.ToString & " => " & sRet)
Else
MessageBox.Show("Recherche du Disque '" & sDrive & "' : " & sNum.ToString)
End If
End If
End Sub