Où l'utilisation de null BSTR est-elle documentée?
-
06-07-2019 - |
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?
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 sibstr
estnull
, la fonction renvoie simplement. -
SysStringLen
indique que passer unnull
pour le paramètrebstr
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:
-
SysReAllocString
ne mentionne pas que se passera-t-il si* pbstr
estnull
. -
SysReAllocStringLen
ne mentionne pas que se passera-t-il si* pbstr
estnull
.
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.