Question

Il est au moins pratique courante de traiter BSTR null (pointeur WCHAR * null) comme une chaîne vide et de concevoir tout le code manipulant les BSTR en conséquence. Réponses à cette question dites la même chose.

Où cette pratique est-elle documentée? Existe-t-il un document officiel décrivant cette convention?

Était-ce utile?

La solution

Le lien indiqué dans la réponse acceptée à cette question concerne un article d’Eric Lippert, Le guide complet d'Eric sur la sémantique BSTR . Bien qu’il s'agisse certainement pas de la documentation officielle, Lippert est une autorité bien connue sur COM (en particulier dans le domaine des scripts).

Cependant, la documentation officielle dit ceci:

  

Un BSTR sans éléments de données est un BSTR vide ou un BSTR NULL. Un BSTR vide indique une valeur de donnée présente mais de longueur nulle. Un BSTR NULL indique une valeur de donnée qui n'est pas présente.

Donc, officiellement, ce sont deux BSTR sans éléments de données, mais avec une sémantique légèrement différente (bien que rien ne dise que ces 2 cas doivent être traités différemment dans votre application). Dans ce cas, je suivrais certainement le conseil de Lippert de les traiter de manière identique. Pour moi, son expérience pratique du fonctionnement réel des implémentations a plus de poids que la phrase du doc. Officiel de BSTR.

Autres conseils

Michael Burr donne ce que je pense devrait être la réponse acceptée. Il est regrettable que la page pour BSTR MSDN ne documente pas cette pratique.

De plus, vous pouvez déduire ce comportement à partir de ces pages de la documentation MSDN:

  • SysFreeString signale que si bstr est null , la fonction renvoie simplement.
  • SysStringLen indique que passer un null pour le paramètre bstr renvoie zéro pour la longueur de la chaîne.
  • SysStringByteLen rapporte la page même comportement; null signifie zéro longueur.

Cependant, la documentation n'est pas complète:

La gestion de BSTR null en tant que chaîne vide semble être une pratique courante, mais la documentation technique disponible chez Microsoft indique en fait qu'il existe une différence entre ces deux-là.

  

Pour tout document faisant référence à la fois à [MS-DTYP] et à [MS-OAUT], en spécifiant   BSTR dans un contexte de représentation filaire DOIT être considéré comme un   référence au type BSTR transmis, tout en spécifiant BSTR dans une   contexte de représentation en mémoire DOIT être considéré comme une référence à la   a présenté le type BSTR ([MS-DTYP] section 2.2.5). Reflétant le   terminologie utilisée pour les BSTR présentés, un NULL BSTR ou un NULL transmis   BSTR, est défini comme la représentation filaire d'un BSTR présenté par NULL;   et un BSTR vide, ou un BSTR transmis vide, est défini comme le fil   représentation d'une longueur nulle présentée BSTR. Préserver cette   distinction dans la représentation filaire permet aux clients et aux serveurs de   faire la distinction entre les valeurs BSTR présentées NULL et les valeurs de longueur zéro présentées   Les BSTR, et donc associent éventuellement différentes applications spécifiques   sémantique à ces deux valeurs.

https://msdn.microsoft.com/en-us/library /cc237580.aspx

Il appartient donc aux implémentations de savoir si elles gèrent les deux de manière égale ou non.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top