winapi — C ++ stl map: проблемы с BSTR

Я использую карту в своем коде <BSTR,struct> bstr является ключом и структурирует значение.

Будет ли это работать или мне придется что-то переопределить?

Я не вижу проблем с компиляцией, и я тоже могу добавлять элементы. Тем не мение, map.find() не работает. Даже если элемент присутствует, он всегда возвращает map.end() (элемент не найден).

Я сделал временный обходной путь следующим образом — по циклу от map.begin() в map.end() и сделать lstrcmpW для каждого элемента. Кажется, это работает, но не думайте, что это слишком эффективно.

Любые предложения / советы о том, что может быть не так? Это нормально использовать BSTR как ключ к карте? Я знаю, что карты не поддерживают некоторые не родные типы данных — структуры или классы … вам нужно определить < оператор для этого.

3

Решение

Используйте ATL CComBSTR в качестве типа ключа вместо BSTR. Перегрузки CComBSTR оператор< выполнять фактическое сравнение строк, а не сравнение указателей (адресов), как вы это делаете в настоящее время.

CComBSTR также упрощает управление временем жизни. Используя BSTR в качестве типа ключа, вы должны убедиться, что BSTR переживают время жизни карты (на самом деле они должны быть освобождены непосредственно перед разрушением карты). CComBSTR следует принципу RAII, поэтому вам не нужно делать какое-либо ручное освобождение.

4

Другие решения

Тип BSTR в C ++ является указателем. Карта сравнивает указатели друг с другом, а не со строкой. Для использования в карте вы должны написать оболочку для BSTR или использовать готовую оболочку.

3