Bonjour,

Envoyé par
juju_debutant
donc si je recapitule:
c++ ==> vba
char * var1 ==> dim var1() as String
int * var2 ==> dim var2 as long
int var3[] ==> dim var3() as long
char * var4[] ==> dim var4() as string
Non.
Si tu te réfères aux remarques de dysorthographie (salut Robert!), tu déclares comme ceci en VBA :
Dim var1 As String, var2 As Long, var3() As Long
Subsiste un doute pour var4.
Tu dis qu'il est déclaré, en C++, sous la forme : char * var4[]. Or déclaré comme ceci, il s'agit d'un String.
Et tu dis que : var4: Array of descriptive strings of xxx.
Soit c'est un array et alors :
Soit c'est un String et alors :
Essaie les deux, tu sauras...

Envoyé par
juju_debutant
qu'en est-il de la declaration de la dll?
Si ta fonction possède un callback (cf Patrick que je salue également), tu pourras l'appeler comme ceci :
Private Declare Function fonction_dll Lib "D:\ma_dll.dll" (ByVal var1 As String, ByVal var2 As Long, ByVal var3() As Long, ByRef var4?? As String) As Long
Attention toutefois au fait que var2 semble être un pointeur.
Auquel cas, il te faut utiliser une compilation conditionnelle (salutations à Jacques) pour les systèmes 64 bits.
Ma boule de cristal te "pondrait" un code dans ce genre :
1 2 3 4 5 6
| #If VBA7 Then
'A NOTER : var2 As LongPtr
Public Declare PtrSafe Function fonction_dll Lib "D:\ma_dll.dll" (ByVal var1 As String, ByVal var2 As LongPtr, ByVal var3() As Long, ByRef var4?? As String) As Long
#Else
Public Declare Function fonction_dll Lib "D:\ma_dll.dll" (ByVal var1 As String, ByVal var2 As Long, ByVal var3() As Long, ByRef var4?? As String) As Long
#End If |
A voir également si ta fonction possède le même nom que Windows soit en 64 bits ou en 32.
Auquel cas, il te faudrait alors une autre compilation conditionnelle du genre (toujours issu de ma boule de cristal) :
1 2 3 4 5 6 7 8 9
| #If VBA7 Then
#If Win64 Then
Private Declare PtrSafe Function fonction_dll Lib "D:\ma_dll.dll" Alias "MonNom64Bits" (ByVal var1 As String, ByVal var2 As LongPtr, ByVal var3() As Long, ByRef var4?? As String) As Long
#Else
Private Declare PtrSafe Function fonction_dll Lib "D:\ma_dll.dll" Alias "MonNom32Bits" (ByVal var1 As String, ByVal var2 As LongPtr, ByVal var3() As Long, ByRef var4?? As String) As Long
#End If
#Else
Private Declare Function fonction_dll Lib "D:\ma_dll.dll" (ByVal var1 As String, ByVal var2 As Long, ByVal var3() As Long, ByRef var4?? As String) As Long
#End If |
A voir également si le résultat Long de ta fonction est un pointeur... Auquel cas :
Private Declare PtrSafe Function fonction_dll Lib "D:\ma_dll.dll" (ByVal var1 As String, ByVal var2 As Long, ByVal var3() As Long, ByRef var4?? As String) As LongPtr
Si non (si pas de callback), il te faudra cocher la référence (cf mon post à ce sujet).
[Remarque] : ce sera beaucoup plus simple...

Envoyé par
juju_debutant
Private Declare Function fonction_dll Lib "D:\ma_dll.dll" (ByVal? var1 As String, ByVal? var2 As long, ByRef ?var3 As long?, ByRef ?var4 As String?) As long
A lire
Si je me fies au peu que tu nous donnes, ta fonction, tu lui passes 4 paramètres et elle te retourne un entier.
Cet entier, soit c'est le résultat attendu de ta fonction, soit c'est une indication te permettant de savoir :
- si elle a réussi
--- dans ce cas, cet entier peut signifier plusieurs choses (plusieurs types de retour)
- si elle a échoué
Si cet entier (retour de ta fonction) est juste une indication et non la valeur attendue, cela signifie que l'un ou plusieurs des paramètres contiennent ce résultat.
Si c'est le cas, ces paramètres doivent être modifiables par ta fonction au sein de ta dll, et doivent donc être passés ByRef.
Partager