bonjour tout le monde,
jaimerai savoir comment on pourrai convertir un string en char * pour que je puisse lexploiter ??
bonjour tout le monde,
jaimerai savoir comment on pourrai convertir un string en char * pour que je puisse lexploiter ??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 AnsiString chaine; Char* chaineEnCharEtoile = chaine.c_str();
bonjour niglo,
jai pas compris comment on fait tellement je marrache les cheveux dessus ! mon code le voici
je ne compren rien cela ne fonctionne pas !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 extern "C" __declspec(dllexport) __stdcall char MaFonction_chemin(char *myVar); /********************** Point d'entré de la DLL **********/ int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; } char __stdcall MaFonction_chemin(char *myVar) { AnsiString chaine; myVar = chaine.c_str(); return myVar; }
meme en mettant en fin de ma fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part return *myVar;
cela ne fonctionne pas !
dites moi si je me déchire mais c normal que ta fonction retourne un char à la place d'un char* ????
Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
_ _ _ _ _ _ _ _ _
La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
_ _ _ _ _ _ _ _ _
Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres
non je veu recuperer une chaine de caractere ! tellement jai mal o crane je ne sais meme plus !!
Effectivement, ca fonctionnera mieux si tu mets char* en type de retour !Envoyé par ferry.jules
MEME EN METTANT UN CHAR * en retour cela ne fonctionne pas !!!!
char __stdcall MaFonction_chemin(char *myVar)
{
AnsiString chaine;
myVar = chaine.c_str();
return *myVar;
}
Oui déjà le char * mais ça ne suffira pas forcément.
Suffit de regarder l'aide sur c_str pour comprendre : le pointeur c_str n'est garanti valide QUE dans la ligne dans laquelle il a été appelé.
Donc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #include <string.h> char* __stdcall MaFonction_chemin(char *myVar) { AnsiString chaine; return strdup(chaine.c_str()); }
Neilos
la jai mi la ligne de commande que tu ma donner ! cela fonctionne mai ce que je recupere ne correspond pas a ce que je dois recevoir !!
Tu peux nous donner la ligne que tu donnes en entrée et ce que tu récupères ?
P.S. Merci de faire des efforts sur ton français, tu n'es pas sur ton téléphone portable.
En même temps tu devrais avoir une chaine vide vu le code de la fonction. Tu veux faire quoi au fait ?
Neilos
bon encore dsl pour le francais !
je veux recuperer une chaine de caractere qui est donner a ma dll ! cette chaine est etabli sous visual basic ! le programme en question sous visual marche parfaitement ! de ce coter ya pas de probleme ! maintenant je dois recuperer cette chaine de caractere pour pouvoir la donner a ma TForm1 pour pouvoir ensuite l'afficher dans une conbobox !
VISUAL BASIC
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Private Declare Function MaFonctionchemin Lib "C:\Documents and Settings\U228167\Desktop\mohamed\Projet\060512\version2\exe_dll\Dll.dll" Alias "MaFonction_chemin" (ByVal myVar As String) As String Private Sub CommandButton1_Click() Dim myVar As String MsgBox ("post affectation chemin") myVar = "Chemin" MsgBox ("pre affectation chemin") MsgBox (myVar) Dim zer As String zer = MaFonctionchemin(myVar) MsgBox (myVar) MsgBox (zer) End Sub ----------------------------------------------------------------------------------------------------------------------------------------------------donc jai etabli une communication qui fonctionne bien mais le resultat la chaine ne correspond pas ! au lieu de voir "chemin" dans ma MsgBox je vois des carré et autres !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 /********************* Include ***************************/ #include <clx.h> #include <windows.h> #include "ExecutableFrm.h" #include "Saisie.h" #include <string.h> extern "C" __declspec(dllexport) __stdcall char MaFonction_chemin(char *myVar); #pragma argsused /********************** Point d'entré de la DLL **********/ int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; } char __stdcall MaFonction_chemin(char *myVar) { AnsiString chaine; myVar= strdup(chaine.c_str()); return *myVar; }
Bonsoir Jules,
Tout dabord désolé pour le char au lieu de char*: en relisant cela me saute aux yeux... J'ai d'ailleurs reproduit cette erreur ce matin en synthètisant des fonctions de mon application en vue de créer une DLL.
La fonction écrite ainsi, a 1 défaut: tu déclares une chaîne "chaine", elle s'intialise et est donc théoriquement vide puis tu la renvoies...
Là y'a franchement un soucis...
Que dois faire cette fonction?
Pour le moment c'est normal si la chaîne retournée est vide.
A quoi sert la chaîne MyStr que tu envoies à la fonction? Que contient-elle?
Quel traitement ta fonction doit réaliser à partir de cette chaîne avant de renvoyer une autre chaîne?
char *__stdcall MaFonction_chemin(char *myVar)
{
AnsiString chaine;
StrPCopy(chaine,myVar); //La fonction doit elle modifier la chaîne?
myVar= strdup(chaine.c_str());
return myVar;
}
Mattetfamilly
on aura tout vu...
Mais où est-ce???...
------------------------------------------------------
n'oublies pas les balises [code ][/code ]
et le Tag
Ce code est faux : tu retourne un char, il s'agit d'un caractère et non pas d'une chaine.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 char __stdcall MaFonction_chemin(char *myVar) { AnsiString chaine; myVar= strdup(chaine.c_str()); return *myVar; }
D'où :
Cette chaine te retourneras une copie de la chaine qu'elle reçoit en paramètre. Regarde bien le code que tu avais avant...outre le fait que ton type de retour était faux, chaine ne contenait rien..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 char* __stdcall MaFonction_chemin(char *myVar) { return strdup(myVar); }
Encore une petite chose, peux tu penser à encadrer ton code dans les balises ...cela améliore la lisibilité !
Neilos
bonsoir,
petites questions quelle est la taille maximum de Chaine
dans l'exemple si elle plus grande que 255 caractères la chaine retournée par la fonction dans la dll est nulle;
tu peux facilement changer la taille du buffer en modifiant la constante
MaxBufferSize
attention évite d'utiliser dans AnsiString dans les DLL cela oblige a trimballer l'artillerie lourde de Borland
Cordialement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 //--------------------------------------------------------------------------- #include <string.h> #include <windows.h> const MaxBufferSize = 255; extern "C" __declspec(dllexport) char* __stdcall MaFonction_chemin(char *myVar); //--------------------------------------------------------------------------- // Remarque importante concernant la gestion de mémoire de DLL lorsque votre DLL utilise la // version statique de la bibliothèque d'exécution : // // Si votre DLL exporte des fonctions qui passent des objets String (ou des // structures/classes contenant des chaînes imbriquées) comme paramètre // ou résultat de fonction, vous devrez ajouter la bibliothèque MEMMGR.LIB // à la fois au projet DLL et à tout projet qui utilise la DLL. Vous devez aussi // utiliser MEMMGR.LIB si un projet qui utilise la DLL effectue des opérations // new ou delete sur n'importe quelle classe non dérivée de TObject qui est // exportée depuis la DLL. Ajouter MEMMGR.LIB à votre projet forcera la DLL et // ses EXE appelants à utiliser BORLNDMM.DLL comme gestionnaire de mémoire. // Dans ce cas, le fichier BORLNDMM.DLL devra être déployé avec votre DLL. // // Pour éviter d'utiliser BORLNDMM.DLL, passez les chaînes comme paramètres "char *" // ou ShortString. // // Si votre DLL utilise la version dynamique de la RTL, vous n'avez pas besoin // d'ajouter MEMMGR.LIB, car cela est fait automatiquement. //--------------------------------------------------------------------------- #pragma argsused BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) { return 1; } //--------------------------------------------------------------------------- char* __stdcall MaFonction_chemin(char *myVar) { char Buffer[MaxBufferSize]; ZeroMemory(Buffer,MaxBufferSize); if (strlen(myVar) > MaxBufferSize ) return ""; strcpy(Buffer,myVar); return Buffer; }
vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
je vous en souhaite une excellente lecture ...
A lire : Les règles du forum
Je vous remercu infiment a tous ceux qui ont contribuer a ce sujet !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager