PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 2018
-
30 oct. 2005 à 08:57
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDerniè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
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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.
cs_MasterHack
Messages postés586Date d'inscriptionjeudi 18 septembre 2003StatutMembreDernière intervention13 février 20082 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
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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ù :-$)
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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).
cs_MasterHack
Messages postés586Date d'inscriptionjeudi 18 septembre 2003StatutMembreDernière intervention13 février 20082 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
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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