C++ DLL retour de paramettre

PRZYBYLSKI Messages postés 10 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 7 septembre 2003 - 30 août 2003 à 22:48
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 4 sept. 2003 à 11:51
Bonjour,
Je suis débutant en C++.
J’essaye de trouver le moyen de faire une chose qui devrait être très simple.

Avoir une application console qui envoi un texte genre « hello » dans une dll
Et un retourne hello + world

Qui peut me montrer un exemple complet.

J’utilise Visual C++ 6 je suppose que ce n’est important au vu du simple projet.

Merci encore.

extern "C" __declspec(dllimport) char * FoncDLL(char * B);

int main(int argc, char* argv[])
{
char * Var= « Hello » ;

cout << FoncDLL(Var)<< endl ;// texte retourné “hello world”

system("PAUSE");
return 0;
}

10 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
31 août 2003 à 11:51
Si la dll doit retourner un ptr de chaine faisant concat de ce qu'elle reçoit + ce qu'elle ajoute, faudra allouer la memoire dans la dll pour garantir la longueur necessaire au chainage.
La dll retourne un char* que le prog affiche et ensuite fait le free(ptr).
BruNews, ciao...
0
PRZYBYLSKI Messages postés 10 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 7 septembre 2003
31 août 2003 à 11:59
Merci
Mais afin de préserver mon portable des coup.
Pouvez me donner un exemple de code.
Surtout au niveau de la gestion des pointeur.
Merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
31 août 2003 à 12:11
Dans la dll:
extern "C" char* __stdcall ConcatWorld(char* psz)
{
char *pret;
int len = strlen(psz);
pret = (char*) malloc(len + 8);
if(!pret) return 0;
strcpy(pret, psz);
strcat(pret, "World");
return pret;
}

Dans le prog, je reprends de ta source:

extern "C" __declspec(dllimport) char* ConcatWorld(char *B);

int main(int argc, char* argv[])
{
char *var = ConcatWorld("Hello ");
if(var) { // verif retour != 0
cout << var << endl;
free(var);
}
else cout << "DEFAUT MEMOIRE" << endl;
system("PAUSE");
return 0;
}

BruNews, ciao...
0
PRZYBYLSKI Messages postés 10 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 7 septembre 2003
31 août 2003 à 23:17
Je mets le code final en ligne fonc.
avec visual C++
Code du EXE
// exe.cpp : Defines the entry point for the console application.
//
#include <windows.h>
#include <stdio.h>
#include "stdafx.h"
#include 
#include <stdlib.h>

extern "C" __declspec(dllimport) char* ConcatWorld(char *B);

int main(int argc, char* argv[])
{
char *var = ConcatWorld("Hello ");

cout << var << endl;

system("PAUSE");
return 0;
}
__________________________________________________________
Le code du dll

// 2237.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <stdlib.h>

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

extern "C" __declspec(dllexport) char* ConcatWorld(char* psz)
{
char *pret;
int len = strlen(psz);
pret = (char*) malloc(len + 8);
if(!pret) return 0;
strcpy(pret, psz);
strcat(pret, "World");
return pret;
}



Merci ça marche!!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
31 août 2003 à 23:28
ATTENTION,
il manque free(var);
ici pas trop important l'appli finit, le systeme va liberer mais sur un prog plus important tu n'arriveras pas au bout si tu ne liberes pas les blocs alloues.
Il faut aussi tester le retour comme je te l'avais mis, si l'alloc memoire rate et que tu ne testes pas tu vas faire badaboum.
BruNews, ciao...
0
PRZYBYLSKI Messages postés 10 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 7 septembre 2003
1 sept. 2003 à 01:47
Je l'ai supprimé pour le moment
car aprés
cout << var << endl;
si je mets free(var);

J'ai un plantage
Et comme je ne veux pas abuser je me suis dis que j'allais bien trouvé un jours pourquoi.
Alors si tu as une idée...
Merci d'avance

Pour moi aujourd'hui il y a deja une grande leçcon avec malloc que je vais étudier d'avantage.
A noter que j'ai du mal a comprendre pourquoi
ecrire :
pret = (char*) malloc(len + 8);
et pas pret = malloc(len + 8);

Bonne nuit
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
1 sept. 2003 à 01:59
Salut,
Pour ta derniere question, la difference entre:
ecrire :
pret = (char*) malloc(len + 8);
et pas pret = malloc(len + 8);

Pret est un char*, et malloc retourne un void*, donc si tu essaye de compiler tu aura une erreur du genre cannot convert 'void *' to 'char *'.
Quand tu rajoutes un (char*) devant malloc tu 'convertis' le void* en char*, et donc plus aucun prob de compilation. Ca s'appelle un cast.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 sept. 2003 à 09:17
pret = (char*) malloc(len + 8);
et pas pret = malloc(len + 8);

Juste pour satisfaire le compilateur car pret est declare en tant que char* et rien de plus.
BruNews, ciao...
0
PRZYBYLSKI Messages postés 10 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 7 septembre 2003
4 sept. 2003 à 11:48
J'ai une question bon je n'y connais rien
mais es que tu ne pense pas qu'il faut faire un free
mais dans la dll?

strcat(pret, "World");
return pret;
free(pret);
}
Merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 sept. 2003 à 11:51
aucune instruction executee au dela du 'return'.
BruNews, ciao...
0
Rejoignez-nous