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

9 réponses

1 2
Avatar
JGP_NoMail
Le 24/01/05 11:49, JGP_NoMail a écrit :
Re-Bonjour,

Pour isoler mon problème, j'ai fais le test ci-dessous qui me donne
comme résultat :
- Fichier "tst.txt" Créé contenant le texte
"TxtTst Coucou : aaaaa"
- Pas de retour de fonction en pas a pas sous VB
- #VALEUR! dans ma cellule B1
Des idées ???



/***** FEUILLE EXCEL *****/
Dans une feuille excel en B1 je met la formule suivante :
=STxtTst(A1)
et dans a1 du texte "aaaaa"

'/***** SOURCE VB ************/
' Source VB Dans un module sous Excel 97 :
Declare Function TxtTst Lib "MaDll.dll" _
(ByVal lpData As String) As Integer
Public Function STxtTst(ByVal lpData As String) As Integer

STxtTst = TxtTst(lpData & Chr(0))
STxtTst = STxtTst + 1
End Function


/********* Source Fonction DLL en C *********/
#define EXPORTS __declspec(dllexport)
EXPORTS short int TxtTst( char *TDataInOut)
{
FILE *fp ;
fp = fopen( "c:tst.txt", "w+") ;
if( fp)
{
fprintf( fp, "TxtTst Coucou : %sn", TDataInOut) ;
fclose(fp) ;
return( 100) ;
}
return( -20) ;
}





Merci d'avance.
JGP



Avatar
JGP_NoMail
Le 24/01/05 14:40, Pascal B. a écrit :
Bonjour,



[...]

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


C'est pas cela, voir le test que j'ai fais, avec une autre fonction,
dans mon post de 15:02.

Merci quand même.

JGP




Pascal B.




Avatar
YannX
Merci,
( j'aurais appris qq.chose aujourd'hui !)
(je vais garder dans ma p'te tete,
(ca va servir.....)
Y@+

"Patrick Philippot" a écrit dans le
message de news:%
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
Patrick Philippot
JGP_NoMail wrote:
'/***** SOURCE VB ************/
' Source VB Dans un module sous Excel 97 :
Declare Function TxtTst Lib "MaDll.dll" _
(ByVal lpData As String) As Integer
Public Function STxtTst(ByVal lpData As String) As Integer

STxtTst = TxtTst(lpData & Chr(0))
STxtTst = STxtTst + 1
End Function



Pourrait on voir la déclaration de et le code relatif à lpData?

Par ailleurs, si vous chargez la DLL dans le Dependency Viewer
(depends.exe), vous voyez bien apparaître le nom *non décoré* de la
fonction dans la liste des exports?

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

'/***** SOURCE VB ************/
' Source VB Dans un module sous Excel 97 :
Declare Function TxtTst Lib "MaDll.dll" _
(ByVal lpData As String) As Integer
Public Function STxtTst(ByVal lpData As String) As Integer

STxtTst = TxtTst(lpData & Chr(0))
STxtTst = STxtTst + 1
End Function




Pourrait on voir la déclaration de et le code relatif à lpData?



La fonction est appelée directement a partir d'une cellule d'Excel
en B1 la formule :
=STxtTst(A1)
et dans a1 du texte "aaaaa"


Par ailleurs, si vous chargez la DLL dans le Dependency Viewer
(depends.exe), vous voyez bien apparaître le nom *non décoré* de la
fonction dans la liste des exports?


Le nom "non décoré" est TxtTst, la Dll a été générée avec la convention
d'appel "cdecl"

JGP






Avatar
Patrick Philippot
JGP_NoMail wrote:
La fonction est appelée directement a partir d'une cellule d'Excel
en B1 la formule :
=STxtTst(A1)
et dans a1 du texte "aaaaa"



Se repose donc la question de la taille du buffer en sortie. Encore une
fois, si la chaîne copiée en retour est plus longue que la chaîne
initiale comment Excel le sait-il si vous ne passez pas par un buffer
intermédiaire dont vous contrôlez vous-même la longeur?

Je ne suis pas sûr du tout que l'on puisse impunément utiliser
directement comme argument "out" une cellule d'Excel. Quand vous
référencez A1, il y a nécessairement copie, voire conversion, du contenu
de la cellule en chaîne puisque le type attendu est une chaîne. Mais de
là à supposer que le buffer dans lequel la copie est effectuée puisse
être utilisé comme argument out, il y a une marge que je ne franchis
pas. Je ne suis pas formel mais j'ai un *gros* doute.

J'avoue que je ne suis plus très bien... J'avais compris que le code
fonctionnait sous Excel mais pas en VB (6?). Ou nous ne parlons que de
VBA?

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

Merci pour votre aide

[snip...]

J'avoue que je ne suis plus très bien... J'avais compris que le code
fonctionnait sous Excel mais pas en VB (6?).


La dll fonctionnait a partire de macro XL4 sous Excel en utilisant
Fonction.appelante
Mais ne fonctionnait pas a partir du VB d'Excel (Vba ?) ni en VB6.

En fait c'est la convention d'appel qui n'était pas bonne, il faut
utilisaer la convention /stdcall/ *ET* déclarer la fonction en export
dans un fichier .DEF du projet en C pour que le nom ne soit pas décoré.




Ou nous ne parlons que de
VBA?



Avatar
Patrick Philippot
JGP_NoMail wrote:
En fait c'est la convention d'appel qui n'était pas bonne, il faut
utilisaer la convention /stdcall/ *ET* déclarer la fonction en export
dans un fichier .DEF du projet en C pour que le nom ne soit pas
décoré.



Désolé de n'avoir pas vérifié ça plus précisément. En fait, j'ai lu le
code trop rapidement et je n'ai pas fait attention car une autre
variante est possible

#define EXPORTS __declspec(dllexport)
EXPORTS short int __stdcall TxtTst( char *TDataInOut)

Dans ce cas, le nom est toujours décoré mais il suffit de préfixer le
nom de la fonction avec _ dans le Declare.

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

[Snip..]


Dans ce cas, le nom est toujours décoré mais il suffit de préfixer le
nom de la fonction avec _ dans le Declare.




Ok,

Merci pour votre aide.

JGP
1 2