Bonjour,
Peux on faire un programme qui est en partie Unicode ? pas entièrement ?
Car quand je met l'option de compilation Unicode; il y a plein d'erreurs ?
Merci,
Christophe
Version imprimable
Bonjour,
Peux on faire un programme qui est en partie Unicode ? pas entièrement ?
Car quand je met l'option de compilation Unicode; il y a plein d'erreurs ?
Merci,
Christophe
Tu peux utiliser explicitement la version unicode de certaines fonctions, mais il est mieux de passer en Unicode et de corriger toutes les erreurs en remplaçant les char const *str = "abc" par des TCHAR const *str = TEXT("abc").
Et n'utiliser les conversions (de préférences, celles de Visual >= 2005: CA2T, CT2A, etc.) que quand une fonction n'existe que dans un seul des deux charsets.
Tu peux aussi tenter de passer en TCHAR avant de changer l'option Unicode, mais changer l'option en premier attirera ton attention sur les endroits où il y a conflit.
Oui, mais c'est bien galère pour obtenir une solution bancale.
Avec autant d'effort mais juste avec un peu plus de finesse on devrait rendre le code UNICODE-aware.
Généralement, remplacer les chaînes caractères en dure par l'appel de la MACRO TEXT, remplacer les char* par des PTCHAR et quelques autres manipulations permettent d'assainir rapidement le code.
Note: Si la macro TEXT() est trop longue à taper, <tchar.h> définit la macro _T() qui fait la même chose.
Je me permet de confirmer les dires de bacelar et Medinoc, en effet il est tout a fait possible de mixer du code UNICODE avec code ANSI. Je développe actuellement un soft basé sur les MFC en UNICODE avec la bibliothèque IBPP en ANSI pour accéder à une base de données Firebird. J'ai un peu modifié les sources d'IBPP avec l'ajout de quelques macro TEXT et autre conversions avec TCHAR. Ma DAL utilise 2 fonctions pour convertir les CString en std::string et vice versa.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 std::string cs2std(const CString& input) { if (input.IsEmpty()) return ""; CT2CA pszString(input); return std::string(pszString); } CString std2cs(const std::string& input) { CString strTmp; if (input.empty()) { strTmp.Empty(); return strTmp; } strTmp = input.c_str(); return strTmp; }
J'ai toujours des erreurs de Link quand je compile le projet :
Pourtant je met bien les bons arguments pour GetStatus :Citation:
error LNK2001: symbole externe non résolu "public: static int __stdcall CFile::GetStatus(char const *,struct CFileStatus &)" (?GetStatus@CFile@@SGHPBDAAUCFileStatus@@@Z)
J'ai tout essayé mais je trouve pas. Une solution ?Code:
1
2 CFileStatus fileInfo; BOOL status = CFile::GetStatus( LPCTSTR(uri), fileInfo );
Merci,
Christophe
Cette signature de CFile::GetStatus date de VS2008, pensez à mettre à niveau au moins votre SDK.
Le problème vient des options de compilation appliquées lors de la compilation du fichier cpp correspondant au fichier .obj qui génère l'erreur de link.
Cet .obj n'aurait jamais du interpréter la déclaration de la méthode comme il semble l'avoir compris, il veut la version ASCII alors qu'il aurait dû vouloir la version UNICODE.
Vérifiez que la constante de compilation "UNICODE" est bien défini lors de la compilation du fichier cpp correspondant.
Si c'est le cas, utilisez l'option /P (http://msdn.microsoft.com/en-us/library/8z9z0bx6.aspx) pour savoir quel cocktail de constantes de compilation fait que la signature de la méthode soit mal calculé.