OVH Cloud OVH Cloud

GetPrivateProfileString et NULL

6 réponses
Avatar
JGP_NoMail
Bonjour,


Pour récupérer la liste des clefs d'une section j'ai besoin d'appeler la
fonction GetPrivateProfileString avec le parametres "lpKeyName " = NULL

iNbChar = GetPrivateProfileString("MaSECTION", NULL, "", sMesClefs,
255, "MonFichier.ini")


Sauf que en Vb il semble que Null et definit en variant, alors que
mettre comme parametre a la place de Null ? J'ai essayé 0, mais cela ne
passe pas.

Ci dessous la déclaration de ma fonction GetPrivateProfileString,
peut-être que la ligne "ByVal lpKeyName As Any, " n'est pas bonne ?


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

Merci de votre aide.

Cordialement,

JGP,

6 réponses

Avatar
Adam Pietrasiewicz
W czwartek 16-grudnia-2004 o godzinie 18:56:42 JGP NoMail napisa³/a


Bonjour,




Pour récupérer la liste des clefs d'une section j'ai besoin d'appeler la
fonction GetPrivateProfileString avec le parametres "lpKeyName " = NULL



iNbChar = GetPrivateProfileString("MaSECTION", NULL, "", sMesClefs,
255, "MonFichier.ini")




Sauf que en Vb il semble que Null et definit en variant, alors que
mettre comme parametre a la place de Null ? J'ai essayé 0, mais cela ne
passe pas.



As tu essaye vbNull?

--
Pozdrawiam
Adam Pietrasiewicz
Avatar
Zoury
Salut! :O)

Sauf que en Vb il semble que Null et definit en variant, alors que
mettre comme parametre a la place de Null ? J'ai essayé 0, mais cela ne
passe pas.



utilise la constante vbNullString pour passer une chaine NULL en paramètre à
des APIs


Ci dessous la déclaration de ma fonction GetPrivateProfileString,
peut-être que la ligne "ByVal lpKeyName As Any, " n'est pas bonne ?

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




en effet.. As Any est généralement utilisé lorsque le type représente une
structure ou un object. On déclare le paramètre *ByRef* avec As Any afin de
travaillé avec un pointeur.

Dans ton cas déclare la déclaration devrait être l'une des trois forme
ci-dessous :
'***
ByRef lpKeyName As Any ' généralement pour les structs
'ou
ByRef lpKeyName As Long ' généralement pour les pointeurs (objets et
chaines)
'ou
ByVal lpKeyName As String ' pour les chaine ASCII (on passe la chaine
directement ou encore vbNullString)
'***

personnellement j'utiliserais ByVal lpKeyName As String parce que c'est
assez standard en VB pour une chaine ASCII (et que les autres paramètres
String de ta fonction utilise déjà cette norme).

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Zoury
concernant cette déclaration :

ByRef lpKeyName As Long ' généralement pour les pointeurs (objets et
chaines)



c'est faux concernant les chaines.. on pourrait les passé ByVal avec
StrPtr() si l'api prend du Unicode..

voici un exemple plus concret sur les façon de passé une chaine à une API :
'***
' Form1
' 4 TextBoxes
' 1 CommandButton
Option Explicit

Private Const WM_SETTEXT As Long = &HC
Private Declare Function SendMessageA_LParamByRefAsAny _
Lib "user32" _
Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any _
) As Long
Private Declare Function SendMessageA_LParamByValAsString _
Lib "user32" _
Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As String _
) As Long

Private Declare Function SendMessageW_LParamByRefAsAny _
Lib "user32" _
Alias "SendMessageW" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any _
) As Long
Private Declare Function SendMessageW_LParamByValAsLong _
Lib "user32" _
Alias "SendMessageW" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long _
) As Long

Private Sub Command1_Click()

Call SetTextBoxes(Text1.Text)

End Sub

Private Sub SetTextBoxes(ByRef sText As String)

Call SendMessageA_LParamByRefAsAny(Text2.hwnd, WM_SETTEXT, 0, ByVal
sText)
Call SendMessageA_LParamByValAsString(Text3.hwnd, WM_SETTEXT, 0, sText)

Call SendMessageW_LParamByRefAsAny(Text4.hwnd, WM_SETTEXT, 0, ByVal
StrPtr(sText))
Call SendMessageW_LParamByValAsLong(Text5.hwnd, WM_SETTEXT, 0,
StrPtr(sText))

End Sub
'***

Note que si tu *déclares* un paramètre ByRef alors qu'il faut passé la
valeur ByVal ça n'affectera rien si tu précises ByVal devant le paramètre
lors de l'appel (comme dans l'exemple ci haut)
reNote que StrPtr() renvoit le pointeur de la chaine Unicode, par défaut VB
renvoit une version ANSI de la chaine, on doit utilise StrPtr() lorsque
l'API accepte du Unicode

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
christophe-pasde
Bonjour,

Byval 0

ça marche aussi?

Pour la GDI les API qui accèptent en parametre un pointeur qui peut-être
null, je leur passent comme ça et ça marche.

Christophe


Zoury a écrit :

concernant cette déclaration :


ByRef lpKeyName As Long ' généralement pour les pointeurs (objets et
chaines)




c'est faux concernant les chaines.. on pourrait les passé ByVal avec
StrPtr() si l'api prend du Unicode..

voici un exemple plus concret sur les façon de passé une chaine à une API :
'***
' Form1
' 4 TextBoxes
' 1 CommandButton
Option Explicit

Private Const WM_SETTEXT As Long = &HC
Private Declare Function SendMessageA_LParamByRefAsAny _
Lib "user32" _
Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any _
) As Long
Private Declare Function SendMessageA_LParamByValAsString _
Lib "user32" _
Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As String _
) As Long

Private Declare Function SendMessageW_LParamByRefAsAny _
Lib "user32" _
Alias "SendMessageW" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any _
) As Long
Private Declare Function SendMessageW_LParamByValAsLong _
Lib "user32" _
Alias "SendMessageW" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long _
) As Long

Private Sub Command1_Click()

Call SetTextBoxes(Text1.Text)

End Sub

Private Sub SetTextBoxes(ByRef sText As String)

Call SendMessageA_LParamByRefAsAny(Text2.hwnd, WM_SETTEXT, 0, ByVal
sText)
Call SendMessageA_LParamByValAsString(Text3.hwnd, WM_SETTEXT, 0, sText)

Call SendMessageW_LParamByRefAsAny(Text4.hwnd, WM_SETTEXT, 0, ByVal
StrPtr(sText))
Call SendMessageW_LParamByValAsLong(Text5.hwnd, WM_SETTEXT, 0,
StrPtr(sText))

End Sub
'***

Note que si tu *déclares* un paramètre ByRef alors qu'il faut passé la
valeur ByVal ça n'affectera rien si tu précises ByVal devant le paramètre
lors de l'appel (comme dans l'exemple ci haut)
reNote que StrPtr() renvoit le pointeur de la chaine Unicode, par défaut VB
renvoit une version ANSI de la chaine, on doit utilise StrPtr() lorsque
l'API accepte du Unicode



Avatar
Zoury
Salut Christophe! :O)

ça dépend de la déclaration :

- As String -> utilise vbNullString
- As Long -> utilise ByVal 0

--
Cordialement
Yanick
MVP pour Visual Basic

"christophe-pasde<> @wanadoo.fr>" <"christophe-pasde<> a écrit dans le
message de news:41c1ed17$0$10230$
Bonjour,

Byval 0

ça marche aussi?

Pour la GDI les API qui accèptent en parametre un pointeur qui peut-être
null, je leur passent comme ça et ça marche.

Christophe


Zoury a écrit :

> concernant cette déclaration :
>
>
>>ByRef lpKeyName As Long ' généralement pour les pointeurs (objets et
>>chaines)
>
>
> c'est faux concernant les chaines.. on pourrait les passé ByVal avec
> StrPtr() si l'api prend du Unicode..
>
> voici un exemple plus concret sur les façon de passé une chaine à une


API :
> '***
> ' Form1
> ' 4 TextBoxes
> ' 1 CommandButton
> Option Explicit
>
> Private Const WM_SETTEXT As Long = &HC
> Private Declare Function SendMessageA_LParamByRefAsAny _
> Lib "user32" _
> Alias "SendMessageA" _
> ( _
> ByVal hwnd As Long, _
> ByVal wMsg As Long, _
> ByVal wParam As Long, _
> ByRef lParam As Any _
> ) As Long
> Private Declare Function SendMessageA_LParamByValAsString _
> Lib "user32" _
> Alias "SendMessageA" _
> ( _
> ByVal hwnd As Long, _
> ByVal wMsg As Long, _
> ByVal wParam As Long, _
> ByVal lParam As String _
> ) As Long
>
> Private Declare Function SendMessageW_LParamByRefAsAny _
> Lib "user32" _
> Alias "SendMessageW" _
> ( _
> ByVal hwnd As Long, _
> ByVal wMsg As Long, _
> ByVal wParam As Long, _
> ByRef lParam As Any _
> ) As Long
> Private Declare Function SendMessageW_LParamByValAsLong _
> Lib "user32" _
> Alias "SendMessageW" _
> ( _
> ByVal hwnd As Long, _
> ByVal wMsg As Long, _
> ByVal wParam As Long, _
> ByVal lParam As Long _
> ) As Long
>
> Private Sub Command1_Click()
>
> Call SetTextBoxes(Text1.Text)
>
> End Sub
>
> Private Sub SetTextBoxes(ByRef sText As String)
>
> Call SendMessageA_LParamByRefAsAny(Text2.hwnd, WM_SETTEXT, 0, ByVal
> sText)
> Call SendMessageA_LParamByValAsString(Text3.hwnd, WM_SETTEXT, 0,


sText)
>
> Call SendMessageW_LParamByRefAsAny(Text4.hwnd, WM_SETTEXT, 0, ByVal
> StrPtr(sText))
> Call SendMessageW_LParamByValAsLong(Text5.hwnd, WM_SETTEXT, 0,
> StrPtr(sText))
>
> End Sub
> '***
>
> Note que si tu *déclares* un paramètre ByRef alors qu'il faut passé la
> valeur ByVal ça n'affectera rien si tu précises ByVal devant le


paramètre
> lors de l'appel (comme dans l'exemple ci haut)
> reNote que StrPtr() renvoit le pointeur de la chaine Unicode, par défaut


VB
> renvoit une version ANSI de la chaine, on doit utilise StrPtr() lorsque
> l'API accepte du Unicode
>


Avatar
JGP_NoMail
Le 16/12/04 19:19, Zoury a écrit :
Salut! :O)


Sauf que en Vb il semble que Null et definit en variant, alors que
mettre comme parametre a la place de Null ? J'ai essayé 0, mais cela ne
passe pas.




utilise la constante vbNullString pour passer une chaine NULL en paramètre à
des APIs





vbNullString était ce qui me manquait.

Merci a tous.

JGP