2010-04-24 7 views
3

J'ai un serveur C# COM qui est consommé par un client cpp.Passer une chaîne de C# à cpp avec COM

L'une des méthodes C# renvoie une chaîne.

Dans cpp, la chaîne renvoyée est représentée en Unicode (UTF-16), au moins en fonction de la vue de la mémoire.

  1. Est-ce toujours le cas avec les chaînes COM?
  2. Existe-t-il un moyen d'utiliser UTF-8 à la place?
  3. J'ai vu du code où les chaînes étaient passées entre cpp et C# sous forme de tableaux d'octets. Y a-t-il un avantage à cela?
+0

Cette discussion s'est transformée en une foire de downvoting peu attrayante avec des réponses conflictuelles. Je vous recommande de rechercher les définitions de BSTR et SysAllocString dans la bibliothèque MSDN et de tirer vos propres conclusions. –

Répondre

0
  1. No.
  2. Oui. Mettez the attribute[return: MarshalAs(UnmanagedType.LPStr)] avant la définition de la méthode en C# si vous souhaitez renvoyer la chaîne en tant que chaîne ANSI au lieu d'Unicode. Oui, l'auteur peut avoir fait cela pour maintenir un contrôle très précis sur le codage du contenu de la chaîne en évitant le comportement de rassemblement par défaut.
1
  1. Oui. Le type de chaîne COM standard est BSTR. C'est une chaîne Unicode encodée en UTF16, tout comme le type de chaîne natif de Windows.
  2. Non, une méthode COM ne va pas comprendre une chaîne UTF8, elle va le transformer en chinois. UTF8 est un bon codage pour un fichier texte, pas pour les programmes manipulant des chaînes en mémoire. UTF8 nécessite entre 1 et 4 octets pour coder un codepoint Unicode. Très incompatible avec les manipulations de chaînes de base comme obtenir la taille ou indexer un personnage.
  3. Les programmes C et C++ ont tendance à utiliser des codages à 8 bits, compatibles avec le type "char". C'est une vieille pratique, datant d'une époque avant que l'Unicode soit là. Il n'y a rien d'attrayant à ce sujet, il y a beaucoup de codages 8 bits de. Le problème typique est que les données saisies en tant que texte ne peuvent être interprétées correctement que si elles sont lues par un programme qui utilise le même codage 8 bits. En d'autres termes, lorsque les ordinateurs sont distants de moins de 1000 miles. Moins en Europe.
+0

Semble à moi comme vous l'avez en arrière. Il appelle un composant C# COM à partir de C++. – sblom

+0

@sblom: oui, votre réponse m'a mystifié. COM regarde de la même manière aux deux extrémités. L'automatisation a toujours été activée Unicode. –

Questions connexes