2010-07-13 2 views
0

Compte tenu: l'application ASP.Net qui utilise une bibliothèque héritage COM héritage bibliothèque COM qui est construit sans Unicode (MBCS) serveur dev Windows 2008 sur lequel tout courtsetlocale() n'affecte pas ConvertBSTRToString() mais le réglage à l'échelle du système le fait?

Nécessaires: app web de support utilisateurs dans différents locales

test:

1) Je définissez les paramètres régionaux du système sur le serveur russe et testé entrées russes. .NET les traite comme UTF16, passe à COM en tant que BSTR, COM le convertit en char * en utilisant ConvertBSTRToString et les paramètres régionaux actuels (russe), les écrit dans un fichier, les lit dans un fichier, les renvoie à .NET et obtient des résultats corrects. 2) J'ai redéfini les paramètres régionaux du système sur US/English, ajouté du code à l'application ASP.NET ou au COM lui-même pour définir explicitement les paramètres régionaux en russe, les paramètres régionaux sont correctement définis (je l'interroge et récupère le russe) , COM reçoit BSTR UTF-16, utilise ConvertBSTRToString pour le convertir en char * et obtient des points d'interrogation "???"!

Pourquoi? Quelle est la différence entre la définition de paramètres régionaux à l'échelle du système et l'appel à setlocale() dans le processus? Quel est le point de setlocale alors? ConvertBSTRToString utilise-t-il autre chose que les paramètres régionaux actuels?

J'ai aussi essayé de faire

System.Threading.Thread.CurrentThread.CurrentCulture = 
new System.Globalization.CultureInfo("ru-RU"); 

dans l'appelant ASP.NET de l'objet COM et essayé de faire

setlocale(LC_ALL, "Russian"); 

     SetThreadLocale(
MAKELCID(MAKELANGID(LANG_RUSSIAN, SUBLANG_RUSSIAN_RUSSIA), SORT_DEFAULT)); 

le long du côté setlocale() dans la bibliothèque COM; aucun effet.

J'apprécierais vraiment les entrées là-dessus!

Répondre

1

Les documents ne permettent pas de savoir ce que ConvertBSTRToString() utilise pour déterminer les paramètres régionaux en cours. Mais vous pouvez être sûr que c'est pas les paramètres régionaux CRT comme défini par setlocale(). Vous devez presque certainement appeler SetThreadLocale().

Utilisez WideCharToMultiByte() pour simplifier la tâche.

+0

Merci, j'ai essayé et mis à jour la question. Ça ne semble pas faire la différence. –

+0

@MK: réponse mise à jour. –

+0

Merci, vous avez raison. ConvertBSTRToString() appelle WideCharToMultiByte() sous le capot, en ignorant les paramètres régionaux. L'appel de WideCharToMultiByte() résout explicitement le problème (sauf que le code repose sur le ConvertBSTRToString() brisé partout et que la réparation ne sera pas triviale, merci Microsoft) –

Questions connexes