0 votes

Comment déclarer une constante de type wide char dans un IDL ?

Nous sommes en train de migrer notre application COM C++ vers l'unicode et, dans le cadre de cette migration, nous voulons également migrer les chaînes constantes de notre IDL vers l'unicode.

Le problème est qu'à l'heure actuelle, nous compilons toujours en ANSI et en UNICODE, ce qui signifie que nous ne pouvons pas utiliser la construction L "String" pour déclarer des graphiques larges.

Pour l'instant, notre constante de chaîne est définie comme suit :

const LPSTR STRING_CONST_NAME = "STRING VALUE" ;

Et nous voulons le définir comme suit :

const LP**T**STR STRING_CONST_NAME = "STRING VALUE" ;

S'il s'agissait d'un code normal, nous aurions simplement ajouté la macro _T("STRING VALUE") qui l'aurait converti en L "STRING VALUE" lors de la compilation en unicode.

Mais d'après ce que je vois, nous ne pouvons pas l'utiliser dans l'IDL car _T est une construction purement C++.

Notre approche est-elle même correcte ? Peut-être devrions-nous la définir de cette manière, quoi qu'il arrive :

const LP**T**STR STRING_CONST_NAME = L "VALEUR DE LA CHAÎNE" ;

2voto

Martin v. Löwis Points 61768

Je me demande d'ailleurs pourquoi il est nécessaire d'avoir des constantes de chaîne dans le fichier IDL. Ne serait-il pas suffisant de les avoir dans un fichier d'en-tête ? Je constate que Microsoft n'a défini des chaînes de caractères littérales que dans sapiaut.idl (en regardant tous les fichiers IDL du SDK de la plate-forme) ; comme ces quelques constantes ne sont jamais utilisées, il se peut que ce soit aussi une erreur. Notez également que ces constantes sont définies comme BSTR .

Si vous voulez qu'ils figurent dans le fichier IDL, il peut suffire de les citer dans cpp_quote.

Si vous tenez absolument à ce qu'ils figurent littéralement dans l'IDL, vous pouvez utiliser un fichier #ifdef d'avoir deux définitions différentes. Dans ce cas, vous devriez également avoir deux bibliothèques de types différentes, avec des ensembles d'interfaces distincts, avec des UUID différents, etc.

0voto

Kim Gräsman Points 5027

S'il est censé être toujours Unicode, il n'est pas utile d'utiliser les constructions "T" -- il suffit de le faire ;

  const LPCWSTR STRING_CONST_NAME = L"STRING VALUE";

"W" pour "large" -

Je ne sais pas comment les typedefs LPC*STR définis par Windows interagissent avec IDL, mais si LPSTR fonctionne, la grande variété devrait fonctionner aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X