Должно быть различие между пустым BSTR и ПУСТЫМ BSTR?

Если бы вы обслуживали ваши статические файлы так:
app.use(express.static(__dirname + '/client/vanity/public/assets/css'));
, тогда, когда на файлы ссылаются, путь начинается с /client/vanity/public/assets/css.

Это означает, что вы будете ссылаться на файл CSS следующим образом (предполагается, что ваши файлы CSS находятся в папке / css):
<link rel="stylesheet" href="/normalize.css">

Полный путь: /client/vanity/public/assets/css + /normalize.css.

9
задан Motti 26 November 2009 в 11:04
поделиться

2 ответа

Да - ПУСТОЙ BSTR совпадает с пустым. Я помню, что у нас были все виды ошибок, которые были раскрыты, когда мы переключились от VS6 до 2003 - класс CComBSTR имел изменение в конструкторе по умолчанию, который выделил его с помощью ПУСТОГО УКАЗАТЕЛЯ, а не пустой строки. Это происходит, когда Вы, например, рассматриваете BSTR как обычную строку стиля C и передаете его некоторой функции как strlen, или попытайтесь инициализировать a std::string с ним.

Eric Lippert обсуждает BSTR's в мельчайших подробностях в полном руководстве Eric По Семантике BSTR:

Позвольте мне перечислить различия сначала и затем обсудить каждый момент в мучительных деталях.

1) BSTR должен иметь идентичную семантику для ПУСТОГО УКАЗАТЕЛЯ и для "". PWSZ часто имеет другую семантику для тех.

2) BSTR должен быть выделен и освобожден с SysAlloc* семейство функций. PWSZ может быть буфером автоматического хранения от стека или выделенный с malloc, новым, LocalAlloc или любое другое средство выделения памяти.

3) BSTR имеет фиксированную длину. PWSZ может иметь любую длину, ограниченную только объемом допустимой памяти в ее буфере.

4) BSTR всегда указывает на первый допустимый символ в буфере. PWSZ может быть указателем на середину или конец строкового буфера.

5) При выделении n-байта BSTR Вы имеете пространство для n/2 широких символов. При выделении n байтов для PWSZ, можно сохранить n / 2 - 1 символ - необходимо оставить комнату для пустого указателя.

6) BSTR может содержать любые данные Unicode включая нулевой символ. PWSZ никогда не содержит нулевой символ за исключением маркера конца строки. И BSTR и PWSZ всегда имеют нулевой символ после их последнего допустимого символа, но в BSTR допустимый символ может быть нулевым символом.

7) BSTR может на самом деле содержать нечетное число байтов - он может использоваться для того, чтобы переместить двоичные данные. PWSZ является почти всегда четным числом байтов и используемый только для хранения строк Unicode.

14
ответ дан 4 December 2019 в 11:09
поделиться

Самый легкий способ обработать эту дилемму состоит в том, чтобы использовать CComBSTR и проверить на.Length (), чтобы быть нулем. Это работает и на пустые и на Нулевые значения.

Однако имейте в виду, пустой BSTR должен быть выпущен или будет утечка памяти. Я видел некоторых из тех, которые недавно в коде других. Довольно трудно для нахождения, если Вы не смотрите тщательно.

5
ответ дан 4 December 2019 в 11:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: