2009-11-16 20 views

Répondre

0

Vous pourriez juste passer L "Quelque chose" dans une méthode COM déclarée comme attendant un BSTR mais vous ne devriez jamais le faire. La convention est qu'un BSTR est alloué en utilisant une des fonctions de la famille SysAllocString() et quiconque reçoit un BSTR peut (et devrait) appeler SysStringLen() quand il veut trouver la longueur de la chaîne. SysStringLen() repose sur l'allocation du BSTR avec les fonctions de la famille SysAllocString() (car il utilise des données supplémentaires allouées et initialisées par ces fonctions) et si cette exigence est violée, le programme rencontrera un comportement indéfini. L'utilisation de SysAllocString() nécessite également l'appel de SysFreeString() pour libérer la chaîne (sinon la mémoire est divulguée), ce qui entraîne beaucoup de code et peut-être des erreurs. Le meilleur moyen consiste simplement à utiliser une classe wrapper telle que CComBSTR ou _bstr_t pour gérer les BSTR - ils appellent SysAllocString()/SysFreeString() si nécessaire (sauf si vous en abusez, bien sûr).

3

BSTR est différent de WCHAR[]. Les valeurs BSTR sont préfixées avec leur longueur, ainsi que les valeurs nulles. Si vous traitez des objets in-process écrits en C ou C++, vous vous en tirerez généralement, car le code C/C++ supposera probablement que votre BSTR est un caractère large terminé par zéro. chaîne. Si, d'un autre côté, vous avez affaire à des objets hors processus/inter-machines, le code proxy/stub marshalling supposera que vous avez réellement passé un BSTR, et attendra de trouver une longueur champ (il a besoin de cela pour savoir combien de données pour marshal). Cela ira horriblement mal. En résumé: si quelque chose attend un BSTR, appelez SysAllocString (ou CComBSTR, ou CString :: AllocSysString).