2009-08-23 7 views
0

Nous migrons notre application COM C++ pour qu'elle soit unicode. Dans le cadre de cette migration, nous souhaitons également migrer les chaînes constantes de notre IDL vers unicode. Le problème est que pour le moment, nous le compilons toujours en ANSI et en UNICODE, ce qui signifie que nous ne pouvons pas utiliser la construction L "String" pour déclarer des diagrammes larges.Comment déclarer une constante de caractère large dans un IDL

Actuellement, notre constante de chaîne définie comme ceci:

const LPSTR STRING_CONST_NAME = "VALEUR STRING";

Et nous voulons le définir comme ceci:

const LP T STR STRING_CONST_NAME = "VALEUR STRING";

S'il était code régulier nous suffit d'ajouter les _T (« VALEUR STRING ») macro qui aurait converti à L « VALEUR STRING » lors de la compilation en unicode

Mais ce que je peux voir que nous pouvons » t l'utiliser dans l'IDL parce que _T est une construction C++ pure.

Notre approche est-elle correcte? Peut-être que nous devrions définir comme ce peu importe:

const LP T STR STRING_CONST_NAME = L "VALEUR STRING";

Répondre

2

Je me demande pourquoi vous avez besoin d'avoir des constantes de chaîne dans le fichier IDL, de toute façon. Ne serait-il pas suffisant de les avoir dans un fichier d'en-tête? Je vois que Microsoft a de larges littéraux de chaîne seulement dans sapiaut.idl (en regardant tous les fichiers de plate-forme SDK IDL); Comme ces quelques constantes ne sont jamais utilisées, cela pourrait aussi être une erreur. Notez également que ces constantes sont définies comme BSTR.

Si vous les voulez dans le fichier IDL, il peut suffire de les cpp_quote.

Si vous les voulez absolument dans l'IDL littéralement, vous pouvez utiliser un #ifdef pour avoir deux définitions différentes. Dans ce cas, vous devriez également avoir deux bibliothèques de types différentes, avec des ensembles séparés d'interfaces, avec différents UUID, et ainsi de suite.

+0

Nous les définissons comme consts parce que nous les consommons plus tard dans d'autres endroits de notre API. Plusieurs de nos méthodes API acceptent ces chaînes en tant que paramètres, et il est plus facile de les définir une fois dans l'API COM et de les consommer plus tard dans tous ses clients. Je vais vérifier ce que vous voulez dire en les définissant comme BSTR, c'est peut-être notre erreur depuis le début. –

+0

Je considérerais les définir comme BSTR un bogue - BSTRs _must_ être alloué en utilisant SysAllocString. Les chaînes littérales à caractères larges ne sont pas des BSTR valides, car elles ne peuvent pas être préfixées en longueur. –

0

S'il est supposé toujours être Unicode, il est inutile d'utiliser les constructions en "T".

const LPCWSTR STRING_CONST_NAME = L"STRING VALUE"; 

« W » est pour « large » -

Je ne sais pas comment le PLC défini Windows * Le jeu STR avec IDL, mais si LPSTR a travaillé, la grande variété devrait fonctionner aussi.

Questions connexes