PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → HELP DLL en C++   Récup de chaine en WINDEV
HELP DLL en C++ Récup de chaine en WINDEV
Iniciado por epaziot, set., 05 2005 1:34 PM - 7 respostas
Publicado em setembro, 05 2005 - 1:34 PM
Bonjour,

Je débute en C et ne suis pas familier des fonctions "transfert" et "recupchaine".

Donc, je test et plante lamentablement sur la valeur récupérée par mon programme.

Lorsque j'appele "read_stdin", j'ai bien 32 en retour.
Avec "RetourneString", j'ai dans"Resultat1" une valeur qui semble être l'adresse de la variable chaine. Mais dans "Buf1", j'ai une chaine qui ressemble à rien.

MERCI de votre aide.

// DLL en C++

#define ISTD_API __declspec(dllexport)

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

char str[256];

ISTD_API int read_stdin(void)
{
return 32;
}

ISTD_API char * RetourneString( void )
{

strcpy(str, "TEST");

return( (char *) &str );
}

// Programme WINDEV

Resultat1 est entier

Buf1 est une chaîne de 256

Resultat1 = AppelDLL32("ISTD.dll" , "?RetourneString@@YAPADXZ")
Buf1 = ChaîneRécupère(&Resultat1,crAdresseASCIIZ)

Info("1" ,Resultat1,Buf1)
Publicado em setembro, 05 2005 - 2:00 PM
Salut,

Il me semble qu'il y a une erreur dans ton chaine récupère.

Resultat1 = AppelDLL32("ISTD.dll" , "?RetourneString@@YAPADXZ")
Buf1 = ChaîneRécupère(&Resultat1,crAdresseASCIIZ)


Resultat1 est déjà une adresse, il ne faut donc pas utiliser
&Resultat1.
La bonne syntaxe serait donc :

Buf1 = ChaîneRécupère(Resultat1,crAdresseASCIIZ)





--
Ciao
Pat Biker
http://wdgotcha.atspace.com
Publicado em setembro, 05 2005 - 2:36 PM
Avec ta modif., j'ai une chaine vide en retour ????
Publicado em setembro, 05 2005 - 9:29 PM
En virant le & de la chaine suivante ?
remplace
return( (char *) &str );
par
return( (char *) str );
Publicado em setembro, 07 2005 - 4:06 PM
Je viens de le faire est j'ai juste "<EOT>"
Publicado em setembro, 07 2005 - 4:35 PM
Salut

Ton code en C est correcte,

le seul problème est probablement que l'adresse à laquelle la chaine "TEST"
est en mémoire est détruite lors de la sortie de la fonction de la dll.
Il faut dont décider quand les plages mémoires de ta dll seront détruites.

Resultat1 est entier
Buf1 est une chaîne de 256
iInst est un entier = ChargeDLL("ISTD.dll") //Chargement de la dll
Resultat1 = AppelDLL32("ISTD.dll" , "?RetourneString@@YAPADXZ")
Buf1 = ChaîneRécupère(&Resultat1,crAdresseASCIIZ)
DéchargeDLL(iInst) //Déchargement (destruction) de la dll
Info("1" ,Resultat1,Buf1)

Voila.

P.S. Peut tu me dire pourquoi le nom de la fonction n'est pas seulement
"RetourneString", et comment as-tu fait pour trouver ce nom bizzard

Mathieu


"Eric" <epaziot@domoform.fr> a écrit dans le message de news:
431bfcba$1@news.pcsoft.fr...


Bonjour,

Je débute en C et ne suis pas familier des fonctions "transfert" et
"recupchaine".

Donc, je test et plante lamentablement sur la valeur récupérée par mon
programme.

Lorsque j'appele "read_stdin", j'ai bien 32 en retour.
Avec "RetourneString", j'ai dans"Resultat1" une valeur qui semble être
l'adresse de la variable chaine. Mais dans "Buf1", j'ai une chaine qui
ressemble à rien.

MERCI de votre aide.

// DLL en C++

#define ISTD_API __declspec(dllexport)

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

char str[256];

ISTD_API int read_stdin(void)
{
return 32;
}

ISTD_API char * RetourneString( void )
{

strcpy(str, "TEST");

return( (char *) &str );
}

// Programme WINDEV

Resultat1 est entier

Buf1 est une chaîne de 256

Resultat1 = AppelDLL32("ISTD.dll" , "?RetourneString@@YAPADXZ")
Buf1 = ChaîneRécupère(&Resultat1,crAdresseASCIIZ)

Info("1" ,Resultat1,Buf1)


Publicado em setembro, 09 2005 - 12:36 PM
Salut,

C'est C++ qui me la pondu (merci Bill) et pour connaitre le nom des entrée dans ma DLL, j'ai utilisé "dependency walker" qui est fourni avec visual studio.

Mais, j'ai résolu le Pb en ajoutant un fichier .def

LIBRARY Fonctions
DESCRIPTION "Essai de dll"
EXPORTS

fn_ret_valeur_chaine _?fn_ret_valeur_chaine@@YAPADXZ
fn_ret_valeur_num _?fn_ret_valeur_num@@YAHXZ


Maintenant, je vais tester tes modifs.

MERCI
Publicado em setembro, 09 2005 - 12:55 PM
MERCi, ça fonctionne bien.


A trop réflechir sur un pb, on fini par oublier l'essentiel.....