Fichier .ini et visual basic 2008 [Résolu]

Signaler
Messages postés
25
Date d'inscription
lundi 19 juillet 2004
Statut
Membre
Dernière intervention
14 décembre 2008
-
 Utilisateur anonyme -
Bonjour^^
Voila j'aimerai parametrer mon application avec un fichier .ini, j'ai cherché sur le net quelques tutos et j'ai trouvé une fonction qui utilise une API, mais certaine partie du code ne sont pas compatible avec VB2008, donc si quelqu'un pouvais m'aider a mettre à jour ceci...

Voila le code (je met en rouge les parties qui ne fonctionne pas sous vb2008) >
// Declaration API pour lire le fichier ini
Private Declare
Function
GetPrivateProfileString Lib
"
kernel32
"
Alias
"
GetPrivateProfileStringA
"
_
    (
ByVal
lpApplicationName
As
String
,
ByVal
lpKeyName
As
Any,
ByVal
lpDefault
As
String
, _
   
ByVal
lpReturnedString
As
String
,
ByVal
nSize
As
Long,
ByVal
lpFileName
As
String
)
As
Long
// Declaration API pour ecrire le fichier ini
Private
Declare
Function
WritePrivateProfileString Lib
"
kernel32
"
Alias
"
WritePrivateProfileStringA
"
_
    (
ByVal
lpApplicationName
As
String
,
ByVal
lpKeyName
As
Any,
ByVal
lpString
As
Any, _
   
ByVal
lpFileName
As
String
)
As
Long
// Fonction pour lire le fichier ini
Private
Function
LitDansFichierIni
(Section
 As 
String
, Cle
 As 
String
, Fichier
 As 
String
, _    Optional ValeurParDefaut
 As 
String
=
"
"
)
 As 
String
 Dim 
strReturn
As
String

strReturn
=
String
(
255
,
0
)
GetPrivateProfileString Section, Cle, ValeurParDefaut, strReturn,
Len
(strReturn), Fichier
LitDansFichierIni
=
Left
(strReturn,
InStr
(strReturn,
Chr
(
0
))
-
1
)
 End 
Function

// Fonction pour ecrire le fichier ini
Private
Function
EcritDansFichierIni
(Section
As
String
, Cle
As
String
, _
   Valeur
As
String
, Fichier
As
String
)
As
Long
EcritDansFichierIni
=
WritePrivateProfileString
(Section, Cle, Valeur, Fichier)
End
Function


Voila, merci...

10 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
41
bon c'est vraiment pour essayer hein....

(désolé pour la couleur)
dans une class nommée Cls_Ini, copie ce code :

 Public Class Cls_Ini

    'Declaration API pour lire le fichier ini
    Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
        (ByVal lpApplicationName As String, _
         ByVal lpKeyName As String, _
         ByVal lpDefault As String, _
         ByVal lpReturnedString As String, _
         ByVal nSize As Integer, _
         ByVal lpFileName As String) As Integer

    'Declaration API pour ecrire le fichier ini
    Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _
        (ByVal lpApplicationName As String, _
         ByVal lpKeyName As String, _
         ByVal lpString As String, _
         ByVal lpFileName As String) As Integer

    'chemin du fichier INI
    Public Path As String

    'fonction qui retourne la chaine selon la '[SECTION]' et la 'CLE='
    Public Function GetValue(ByVal sSection As String, ByVal sKey As String) As String
        'buffer
        Dim Buffer As New System.Text.StringBuilder(255)
        Buffer.Append(" ", 255)
        Dim sRet As String = Buffer.ToString
        Buffer.Length = 0

        'retour API
        Dim iRet As Integer = GetPrivateProfileString(sSection, sKey, "", sRet, sRet.Length, Me.Path)

        'retour fonction
        Return sRet.Substring(0, iRet)
    End Function

    'procédure qui va écrire la valeur à la '[SECTION]' et la 'CLE=' voulues
    Public Sub SetValue(ByVal sSection As String, ByVal sKey As String, ByVal sValue As String)
        WritePrivateProfileString(sSection, sKey, sValue, Me.Path)
    End Sub

End Class

et dans une form par exemple :

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim INI As New Cls_Ini
        INI.Path = "C:\test.ini"
        MessageBox.Show(INI.GetValue("SEC", "KEY"))
        INI.SetValue("SEC", "KEY", "test")
    End Sub

la création du buffer est fonctionnelle, maintenant aucune garantie que çà soit la meilleure manière...
si un DotNetien passe par là...
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut
En VB.Net, les types de variable ont changées et les définitions que tu utilises sont dédiées à VB6 :
   VB6      .Net
   Long      Integer
   Integer   Short

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
25
Date d'inscription
lundi 19 juillet 2004
Statut
Membre
Dernière intervention
14 décembre 2008

Merci pour cette info, et pour les fonctions left() et String() aurais tu une idée ? car elle ne fonctionne pas non plus...
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
41
salut,
string() -> utiliser un StringBuilder
left -> çà doit être IndexOf(..)
any -> string ou object

jète un oeil dans les snippets de www.codyx.org dans la catégorie CHAINES et API, tu devrais trouver de quoi faire ;)
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
25
Date d'inscription
lundi 19 juillet 2004
Statut
Membre
Dernière intervention
14 décembre 2008

Sa marche, un trés grand merçi à vous^^
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
41
même si je ne fais pas de DotNet, ma curiosité l'a emporté...

j'avais parlé de déclaré le ANY en OBJECT..., on était pas si loin,
après demande de confirmation (merci Kenji), il est possible de déclarer l'API :

    'Declaration API pour lire le fichier ini
    Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
        (ByVal lpApplicationName As String, _
         ByVal lpKeyName As String, _
         ByVal lpDefault As String, _
         ByVal lpReturnedString As System.Text.StringBuilder, _
         ByVal nSize As Integer, _
         ByVal lpFileName As String) As Integer

ce qui nous fait alors gagner quelques lignes pour GetValue :

'fonction qui retourne la chaine selon la '[SECTION]' et la 'CLE='
   Public Function GetValue(ByVal sSection As String, ByVal sKey As String) As String
        'buffer
        Dim Buffer As New System.Text.StringBuilder(255)

        'appel API
        Call GetPrivateProfileString(sSection, sKey, "", Buffer, Buffer.Capacity, Me.Path)

        'retour fonction
        Return Buffer.ToString()
        Buffer.Length = 0
    End Function

++ ;)
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
Salut,

Juste en passant, pourquoi utiliser un fichier ini? Il n'y a pas de classe pour gérer les ini dans le framework, ce n'est pas pour rien, c'est parce que aujourd'hui on fait tout avec du xml. Et pour gérer les xml, il y a tout ce qu'il faut das le framework

Super ça marche bien mais commenet supprimer une clé voire une section entière ? Seule solution là : devoir tout réécrire.

Bon, j'ai trouvé pour supprimer une clé mais pour une section entière, ça ne marche pas.

    Public Sub DeleteKey(ByVal sSection As String, ByVal sKey As String)
        'Supprime la 'CLE=' dans la '[SECTION]'.
        WritePrivateProfileString(sSection, sKey, vbNullString, Me.PathINI)
    End Sub


J'ai tenté pour supprimer la section :
    Public Sub DeleteSection(ByVal sSection As String)
        'Supprime la '[SECTION]'.
        WritePrivateProfileString(sSection, vbNullString, vbNullString, Me.PathINI)
    End Sub


Marche pas !

Si ça marche ! Je suis con
J'avais fait une faute dans le nom de ma section. J'utilise "Me.PathINI" alors que dans l'exemple c'est "Me.Path" pour le chemin du fichier. C'est cool toutes les fonctions sont là pour traiter les fichiers INI.