Numéro de série de disque

Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 octobre 2008 - 24 juin 2008 à 18:34
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Derniè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 !!!

16 réponses

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
24 juin 2008 à 18:39
salut,

remplace tous les types Long en Integer

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
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


~
<small>Mortalino ~ [code.aspx?ID=39466 Colorisation
automatique]</small>

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
24 juin 2008 à 20:54
mortalino,


ta fonction retourne 0 sur mes deux disques dur
0
Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 octobre 2008
24 juin 2008 à 21:00
Exact !
J'ai remplacé mon cade par le tien, et j'ai la même erreur, "Strnul" est utilisé avant qu'une valeur ne lui soit assignée !
Et le 0 aussi
0

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

Posez votre question
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
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

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
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

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
24 juin 2008 à 21:11
et si tu as toujours l'erreur avec ta variable (moi je ne l'ai pas)
alors fait un
Dim Strnul As String = Space$(255)

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
24 juin 2008 à 21:16
ByRef ça marche merci
0
Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 octobre 2008
24 juin 2008 à 21:23
Bon ça marche, merci !
Mais j'ai toujours l'erreur avec "Strnul"
Aussi, j'ai un chiffre négatif pour mon disque D !?!
0
Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 octobre 2008
24 juin 2008 à 21:31
Désolé, j'ai répondu en même temps que ton post,
J'ai essayé le Space$(255), ça m'enlève l'erreur, mais j'ai le retour du zéro en réponse !
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
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

~
<small>Mortalino ~ [code.aspx?ID=39466 Colorisation
automatique]</small>

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 octobre 2008
24 juin 2008 à 21:50
Nickel !
Merci bien
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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
0
Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 octobre 2008
2 juil. 2008 à 12:37
En language simple pour un utilisateur débutant, ça veut dire quoi ?
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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  
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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

<!-- Coloration syntaxique vb/vba/vb.net : http://charles.racaud.free.fr/code-syntaxing/ -->Coloration syntaxique vb/vba/vb.net

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
0
Rejoignez-nous