Bonjour,
je développe un plugin 4D en C++ et j'ai besoin de récupérer la valeur passé en paramètre dans 4D.
Quand je fais juste strcpy mon char renvoi seulement un caractère.
Comment faire pour mettre un unichar dans un char?
Bonjour,
je développe un plugin 4D en C++ et j'ai besoin de récupérer la valeur passé en paramètre dans 4D.
Quand je fais juste strcpy mon char renvoi seulement un caractère.
Comment faire pour mettre un unichar dans un char?
Qu'est qu'un unichar ?
Si tu est sous windows, avec VS. Tu as les char(1octets) et les wchar_t(2octets). La macros Windows TCHAR permet en fonction des directives compilation de choisir soit l'un soit l'autre.
En STL tu as std::string et std::wstring a convertir avec std::copy.
En C tu as des fonctions comme wctomb, mbtowc.
L'API Windows fournir des fonctions comme MultiByteToWideChar...
Montre nous les prototypes de tes fonctions, pour comprendre quels types elle attende et pourquoi tu dois faire des conversions.
________________________________________________
http://bliquid.fr : Blog sur Android et l'Acer Liquid
Donc le truc c'est que je récupère des valeur provenant de 4D.
voila comment je l'ai récupère dans visual studio:
PA_Unichar* CodeCPS_uchars;
PA_Unistring* CodeCPS;
PA_Unichar* returnValue_uchars;
CodeCPS = PA_GetStringParameter( params, 1 );
CodeCPS_uchars = PA_GetUnistring( CodeCPS );
la valeur est de CodeCPS_uchars.
Lorsque je veux visualiser ce qu'il y a dedans avec une messagebox je vois tout apparaitre.
Le seul souci ce que quand je fait un strcpy pour mettre cette valeur dans une autre variable, ça met que le premier caractère seulement.
les PA_Unichar doivent etre des type def vers des wchar_t.
Donc tu devrais compiler ta solution en Unicode : VS: configuration Charset Use Unicode Character Set.
Quand tu vas appeler MessageBox cela vas renvoyer vers MessageBoxW.
Par contre il ne faut pas utiliser strcpy mais sa version unicode wcscpy.
________________________________________________
http://bliquid.fr : Blog sur Android et l'Acer Liquid
Merci ça marche super bien.
Cela fonctionne-t-il dans l'autre sens?? Car je doit renvoyer un PA_uchars.
Il faut que tu comprenne ce que tu fais. Si 4D et ton plugin est en Unicode tu n'as pas besoin de faire des conversions, mais seulement d'utilisé des fonctions Unicode.
________________________________________________
http://bliquid.fr : Blog sur Android et l'Acer Liquid
Alors le truc c'est que j'ai mit des messages d'erreur.
Quand j'utilise
wcscpy(tcPINCode, CodeCPS_uchars);
ça fonctionne très bien, car avec une messagebox je vois très bien que tcPINCode = CodeCPS_uchars.
mais quand je l'utilise ensuite dans cette fonction
S_hinstApiLecResult = Lec_ControleCPS (pusNoSession,&tcPINCode,&tcDateFinValidite,&szIdentApplication,&tcTypeCarte,&pcPresentPINCode,&tcCategorie,&pusCodeErreur);
le message d'erreur me renvoi que le code est incorrect.
Alors que si je n'utilise pas
wcscpy(tcPINCode, CodeCPS_uchars);
et que au debut je déclare
char tcPINCode[4]="1234";
ça fonctionne très bien.
D'après ftp://sigmasoft.fr/depot/conf/api_lec.h, le prototype de la fonction utilise des char. Il faut donc soit trouvé la version unicode de cette lib soit faire des conversions.
Sinon ne cast pas tes chaines de carataire et regarde les warnings que le compilateur t'affiche, normalement il ne voudrai jamais faire une conversion automatique de char* en wchar_t*.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 char tcPINCode[5]; wchar_t CodeCPS_uchars[5] = L"1234"; //Attention 5 et pas 4 ! // => 1 argument destination , 2eme source! wcstombs(tcPINCode, CodeCPS_uchars);
Donc en gros tu as beaucoup de taff bien lourd a convertir vers ton API en char, et les retours en wchar_t.
ATTENTION! on ne peut utiliser wcscpy pour convertir des char* en wchar_t* !
________________________________________________
http://bliquid.fr : Blog sur Android et l'Acer Liquid
Bon je te remercie du temps que tu as passé sur mon cas. J'ai enfin trouvé la solution,
WideCharToMultiByte( CP_ACP, 0, CodeCPS_uchars, -1, tcPINCode, 5, NULL, NULL );
tout fonctionne correctement avec ça.
Merci encore.
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