Зачем использовать CComBSTR вместо простого прохождения WCHAR *? - PullRequest
1 голос
/ 16 ноября 2009

Я новичок в COM. В чем именно заключается преимущество замены:

L"String"

с

CComBSTR(L"String")

Я вижу список изменений в COM-части моего приложения .NET, где все строки заменяются таким образом. Хотелось бы узнать, что для этого нужно.

Ответы [ 2 ]

3 голосов
/ 17 ноября 2009

BSTR не совпадает с WCHAR[]. BSTR значения начинаются с их длины, а также заканчиваются нулем.

Если вы имеете дело с внутрипроцессными объектами, написанными на C или C ++, вам обычно это сойдет с рук, потому что код C / C ++, вероятно, будет предполагать, что ваш BSTR является строкой широких символов с нулевым символом в конце .

Если, с другой стороны, вы имеете дело с внепроцессными / кросс-машинными объектами, код прокси / заглушки будет предполагать, что вы действительно передали BSTR, и будет ожидать, что найдет поле длины (это нужно, чтобы знать, сколько данных нужно собрать). Это будет ужасно неправильно.

Вкратце: если что-то ожидает BSTR, вызовите SysAllocString (или CComBSTR, или CString :: AllocSysString).

0 голосов
/ 17 ноября 2009

Вы можете просто передать L "Something" в метод COM, объявленный как ожидающий BSTR, но вы никогда не должны этого делать.

Соглашение состоит в том, что BSTR выделяется с использованием одной из функций семейства SysAllocString (), и любой, кто получает BSTR, может (и должен) вызывать SysStringLen () всякий раз, когда он хочет найти длину строки. SysStringLen () полагается на то, что BSTR выделяется с помощью функций семейства SysAllocString () (поскольку он использует дополнительные данные, выделенные и инициализированные этими функциями), и если это требование нарушается, программа будет работать в неопределенном режиме.

Использование SysAllocString () напрямую требует также вызова SysFreeString () для освобождения строки (в противном случае память просачивается), что приводит к большому количеству кода и, возможно, к ошибкам. Лучше всего просто использовать класс-оболочку, такой как CComBSTR или _bstr_t, для управления BSTR - при необходимости они будут вызывать SysAllocString () / SysFreeString () (если, конечно, вы не злоупотребляете ими).

...