OVH Cloud OVH Cloud

DLL c et parametre chaine

19 réponses
Avatar
JGP_NoMail
Bonjour,
J'ai une dll comportant une fonction C prenant en paramètres 2 chaîne de
caractères, et modifiant la première chaîne
// Source C de MaDll.dll
void EXPORTS MaFunc( char *DataInOut, char *DataIn)
{
// quelque chose
memcpy( DataInOut, unevar, 15) ;
}

Comment doit je déclarer et utiliser cette fontion en vb, J'ai essayer
le code ci-dessous, mais cela ne fonctionne pas.

' Source VB
Declare Sub MaFuncLib "MaDll" _
Alias "MaFunc" (ByVal lpData As Any, _
ByVal lpKeyName As String)


Function UneFonction() as string
Dim ChaineInOut as string
ChaineInOut = "bonjour toto"
MaFuncLib( ChaineInOut, "123")
UneFonction = ChaineInOut
end function

Merci d'avance.
JGP

10 réponses

1 2
Avatar
Illinger Philippe
"JGP_NoMail" wrote in message news:ct2jsl$dau$
Bonjour,



Bonjour,


Function UneFonction() as string
Dim ChaineInOut as string
ChaineInOut = "bonjour toto"



...une petite erreur...

ChaineInOut = "bonjour toto" & chr(0)

sera bien mieux




---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.841 / Virus Database: 572 - Release Date: 21/01/2005
Avatar
Patrick Philippot
Bonjour,

Declare Sub MaFuncLib "MaDll" _
Alias "MaFunc" (ByVal lpData As Any, _
ByVal lpKeyName As String)



ByVal lpData As String

Function UneFonction() as string
Dim ChaineInOut as string
ChaineInOut = "bonjour toto"
MaFuncLib( ChaineInOut, "123")
UneFonction = ChaineInOut
end function



ChaineInOut est un paramètre out. Si la valeur copiée est plus longue
que la valeur initiale, il va y avoir un problème. Il faut donc allouer
la valeur maximum possible dès le départ.

Dim ChaineInOut as String * <longueur_max)

Nous partons du principe qu'il s'agit bien de C et pas de C++ (auquel
cas, la fonction devrait être déclarée extern "C")?

mais cela ne fonctionne pas.



Je vais me répéter mais en quoi cela nous aide-t-il à faire un
diagnostic :-))) ? Quelle erreur? Sur quelle ligne de code?

Merci.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
JGP_NoMail
Le 24/01/05 12:12, Illinger Philippe a écrit :

Function UneFonction() as string
Dim ChaineInOut as string
ChaineInOut = "bonjour toto"




...une petite erreur...

ChaineInOut = "bonjour toto" & chr(0)

sera bien mieux



Ok pour le fin de chaine, mais cela ne fonctionne toujours pas.
Avatar
JGP_NoMail
Le 24/01/05 12:15, Patrick Philippot a écrit :


ChaineInOut est un paramètre out. Si la valeur copiée est plus longue
que la valeur initiale, il va y avoir un problème. Il faut donc allouer
la valeur maximum possible dès le départ.

Dim ChaineInOut as String * <longueur_max)



Ok pour la longueur.


Nous partons du principe qu'il s'agit bien de C et pas de C++ (auquel
cas, la fonction devrait être déclarée extern "C")?




C'est bien du C, la fonction est bien déclarée extern est peut être
appelée dans une feuille de macro au format excel iv avec :
=FONCTION.APPELANTE("MaDll.dll";"MaFunc";"1FC";D2;B2)






mais cela ne fonctionne pas.




Je vais me répéter mais en quoi cela nous aide-t-il à faire un
diagnostic :-))) ? Quelle erreur? Sur quelle ligne de code?



Pas de code d'erreur, en pas a pas, j'arrive sur la fonction, mais je ne
passe pas sur la ligne suivante


Merci.



Avatar
YannX
Bnjr,

Ton dernier message du Post m'interpelle,
sinon j'avais a priori une idée fixe :

' Source VB
Declare Sub MaFuncLib "MaDll" _
Alias "MaFunc" (ByVal lpData As Any, _
ByVal lpKeyName As String)

Comment la Sub MaFuncLib() est-elle sensée
retourner son résultat ?
Nous nous souvenons qu'en C/C++ les arguments sont "copiés"
(au sens strict !) et la fonction travaille sur une copie par sécurité,
et donc les modifications ne sont pas remontées ; pour obtenir
cet effet de bord, on utilise le passage par pointeur sur,
ou mieux par référence, qui se traduit en Basic par ByRef !

Is it ?
Y@+


"JGP_NoMail" a écrit dans le message de
news:ct2mse$f5v$
Le 24/01/05 12:15, Patrick Philippot a écrit :
>
>
> ChaineInOut est un paramètre out. Si la valeur copiée est plus longue
> que la valeur initiale, il va y avoir un problème. Il faut donc allouer
> la valeur maximum possible dès le départ.
>
> Dim ChaineInOut as String * <longueur_max)

Ok pour la longueur.

>
> Nous partons du principe qu'il s'agit bien de C et pas de C++ (auquel
> cas, la fonction devrait être déclarée extern "C")?
>

C'est bien du C, la fonction est bien déclarée extern est peut être
appelée dans une feuille de macro au format excel iv avec :
=FONCTION.APPELANTE("MaDll.dll";"MaFunc";"1FC";D2;B2)


>

>>mais cela ne fonctionne pas.
>
>
> Je vais me répéter mais en quoi cela nous aide-t-il à faire un
> diagnostic :-))) ? Quelle erreur? Sur quelle ligne de code?

Pas de code d'erreur, en pas a pas, j'arrive sur la fonction, mais je ne
passe pas sur la ligne suivante

>
> Merci.
>


Avatar
Pascal B.
Bonjour,

"JGP_NoMail" wrote in message news:ct2mse$f5v$
|
|> Pas de code d'erreur, en pas a pas, j'arrive sur la fonction, mais je ne
| >passe pas sur la ligne suivante
|

Verifie le code de ta fonction (en C).
Si tu ne passes pas à l'instruction suivante, c'est que ta fonction "cycle" indéfiniment.

Pascal B.
Avatar
Patrick Philippot
Bonjour,

Illinger Philippe wrote:
...une petite erreur...

ChaineInOut = "bonjour toto" & chr(0)



Cet ajout ne sert à rien. La conversion en asciiz est faite
automatiquement quand la chaîne est passée ByVal.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
YannX wrote:
ou mieux par référence, qui se traduit en Basic par ByRef !



Non, non, en VB6, pour passer un pointeur vers une chaîne à une fonction
exportée par une DLL, il faut passer la chaîne ByVal, ce qui provoque le
passage de l'adresse.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
JGP_NoMail
Le 24/01/05 14:19, YannX a écrit :
Bnjr,



Bonjour,

Ton dernier message du Post m'interpelle,
sinon j'avais a priori une idée fixe :


Merci de te pencher sur mon problème.


' Source VB
Declare Sub MaFuncLib "MaDll" _
Alias "MaFunc" (ByVal lpData As Any, _
ByVal lpKeyName As String)

Comment la Sub MaFuncLib() est-elle sensée
retourner son résultat ?
Nous nous souvenons qu'en C/C++ les arguments sont "copiés"
(au sens strict !) et la fonction travaille sur une copie par sécurité,


Tout a fait, La réponse a ta question est dans mon post initial, avec un
bout de ma fonction :
void EXPORTS MaFunc( char *DataInOut, char *DataIn)
{
// quelque chose
memcpy( DataInOut, unevar, 15) ;
}

DataInOut et un pointeur sur une chaine de caractères.
A l'adresse pointée par DataInOut, je copie mes données.


et donc les modifications ne sont pas remontées ; pour obtenir
cet effet de bord, on utilise le passage par pointeur sur,
ou mieux par référence, qui se traduit en Basic par ByRef !



C'est pas mieux.

Is it ?
Y@+


"JGP_NoMail" a écrit dans le message de
news:ct2mse$f5v$

Le 24/01/05 12:15, Patrick Philippot a écrit :


ChaineInOut est un paramètre out. Si la valeur copiée est plus longue
que la valeur initiale, il va y avoir un problème. Il faut donc allouer
la valeur maximum possible dès le départ.

Dim ChaineInOut as String * <longueur_max)



Ok pour la longueur.


Nous partons du principe qu'il s'agit bien de C et pas de C++ (auquel
cas, la fonction devrait être déclarée extern "C")?




C'est bien du C, la fonction est bien déclarée extern est peut être
appelée dans une feuille de macro au format excel iv avec :
=FONCTION.APPELANTE("MaDll.dll";"MaFunc";"1FC";D2;B2)



mais cela ne fonctionne pas.




Je vais me répéter mais en quoi cela nous aide-t-il à faire un
diagnostic :-))) ? Quelle erreur? Sur quelle ligne de code?



Pas de code d'erreur, en pas a pas, j'arrive sur la fonction, mais je ne
passe pas sur la ligne suivante


Merci.










Avatar
Patrick Philippot
JGP_NoMail wrote:
Pas de code d'erreur, en pas a pas, j'arrive sur la fonction, mais je
ne passe pas sur la ligne suivante



Dans la fonction appelée, le memcpy inclut bien le terminal?

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
1 2