INI et vérification

Résolu
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 30 oct. 2005 à 08:57
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 1 nov. 2005 à 14:48
bonjour,
[VB6]
voilà, je fais une classe gérant entre autre les fichiers INI.
mais me voilà devant un problème ridicule......

pour lire une valeur, disons :
[SECTION1]
KEY1=Value1

pas de problème, j'ai bien "Value1"
si KEY1 est vide, j'ai évidemment Null

seulement, si je lis KEY2 (qui n'existe pas), j'ai aussi Null, et malheureusement pas d'erreur.
pareil si je lis des valeurs pour un fichier incorrect!
j'aurais voulu pouvoir tester (peut-être avec GetLastError mais apparemment non) si le LONG 0 retourné est un 0 d'erreur ou de valeur Null.

voilà, et tant qu'on est dans le INI, une petite confirmation? :
GetPrivateProfileSection
WritePrivateProfileSection
GetPrivateProfileSectionNames
fonctionnent-elles pour tous les Windows ou uniquement 16bits

comptant sur un peu d'aide, merci
PCPT [AFCK]

10 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
1 nov. 2005 à 14:48
bonjour à tous,
bon, je vais clotûrer ce Topic...

comme indiqué plus haut, on ne peut malheureusement détecter de message d'erreur que pour un fichier inexistant.
un zéro renvoyé peut donc être une valeur de retour (Top = 0) ou vide (Top=)

pour palier à ce problème, je vérifie que la valeur saisie ne soit pas vide.
si c'est le cas, je supprime directement le "top=" ainsi :

Dim bRet As Boolean
If Trim(sValue) = "" Then
bRet = CBool(WritePrivateProfileString(mSection, mKey, 0&, mPathIni))
Else
bRet = CBool(WritePrivateProfileString(mSection, mKey, sValue, mPathIni))
End If

et pour l'autre partie de ma question : compatibilité des API "incertaines", on arrive au même résultat avec
la déclaration du précédent post. c'est à dire qu'en jonglant avec un buffer > 8000 pour les sections,
et en écrivant des "0&" selon les besoins, les 2 seules API Get et Write classiques nous donnent les mêmes
fonctionnalités.
désolé si c'est un peu flou, je posterai la source une fois terminée. la partie INI y est expliquée (et opérationnelle).
il me reste encore tout le reste, donc patience

ps : MasterHack -> même si on a pas avancé, merci d'avoir donné suite.

bonne contituation
@+

PCPT [AFCK]
3
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
30 oct. 2005 à 10:39
salut,
pour faire la difference, avec GetPrivateProfileSection, on a :
veleur=GetPrivateProfileSection(nom_app,nom_clé,valeur_par_defaut,nbrlenght,fichier_ini)
voila au cas ou la cle n'existe pas ça ne renvoie pas null mais plutot valeur_par_defaut.
aller a++


<HR>

Life is short...Learn more
Copy Rights <> Rights to Copy
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 oct. 2005 à 11:17
salut,

-> MasterHack
pour "ProfileSection", il y a un gros souci. par rapport à ton exemple, je n'ai pas la même déclaration d'API que toi

Private Declare Function GetPrivateProfileSection Lib "kernel32" Alias "GetPrivateProfileSectionA" _
(ByVal lpAppName As String, ByVal lpReturnedString As String, _
ByVal nSize As Long, ByVal lpFileName As String) As Long

par contre, pour "ProfileString", çà correspondrait....
Private Const cErrorDefaultString As String = "!!! This String is Returned When a Value is not Found !!!"

et l'appel, précédé du remplissange du Buffer de retour, se fait comme suit :
sTempValue = Left$(sRet, GetPrivateProfileString(mSection, mKey, cErrorDefaultString, sRet, Len(sRet), mPathIni))

mais j'en suis au même point.
"900" est la valeur à lire
sTempValue contient "900" quand tout est ok.
et alors qu'elle devrait contenir ma constante quand mPathIni est vide, elle contient "500".

je vois vraiment pas pourquoi... (j'ai même rebooté au cas où :-$)

une idée?
PCPT [AFCK]
0
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
30 oct. 2005 à 11:21
re,
ops desole cettais pas section mais plutot GetPrivateProfileString


<HR>

Life is short...Learn more
Copy Rights <> Rights to Copy
0

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

Posez votre question
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
30 oct. 2005 à 11:27
je crois qu'il faut allouer de l'espace pour ta varibale sRet avec un :
sRet=space(nbrchar) ou sRet=string(nbr,0)


<HR>

Life is short...Learn more
Copy Rights <> Rights to Copy
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 oct. 2005 à 11:31
"précédé du remplissange du Buffer de retour"
c'est déjà le cas (avec une constante Max_Length = 255). et donc bien "ProfileString"

donc mis à part que je n'avais pas copié le code dans le Topic, tout en faisait correctement, j'en suis au même point
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 oct. 2005 à 11:55
bon!
après quelques tests, apparemment, le seul moyen de récupérer une chaîne par défaut (donc erreur) est que le chemin soit différent de VbNullString.
je test donc le chemin valide dans l'instanciation de la classe.
le Topic reste ouvert, si ce n'est que pour avoir confirmation, ainsi que des informations supplémentaires pour
compatibilité 16-bits API (voir Topic).

merci
PCPT [AFCK]
0
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
30 oct. 2005 à 12:03
apres consultation de l'apiviewer, ça a l'aire d'etre compatible 16 bits et 32 bits .


<HR>

Life is short...Learn more
Copy Rights <> Rights to Copy
0
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
30 oct. 2005 à 12:05
ah ya une difference de declaration :
16 bits :

Private Declare Function GetPrivateProfileString Lib "Kernel.dll" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer

32 bits :

Private Declare Function GetPrivateProfileString Lib "kernel32.dll" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long


<HR>

Life is short...Learn more
Copy Rights <> Rights to Copy
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 oct. 2005 à 12:18
re,
j'utilise aussi l'API Viewer (Guid API) et c'est bien pour çà que le doute subsiste.
et pour les déclarations dont tu parles, c'est bien les seules qui ne me posent pas de problème....


#If Win32 Then
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
Private Declare Function GetPrivateProfileString Lib "KERNEL32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As Any, ByVal lpKeyName As Any, ByVal lpDefault As Any, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
#Else
Private Declare Function WritePrivateProfileString Lib "Kernel" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Integer
Private Declare Function GetPrivateProfileString Lib "Kernel" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As Any, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
#End If


<SMALL> Coloration syntaxique automatique [AFCK]</SMALL>


celà dit, merci pour tes efforts
0
Rejoignez-nous