Обработка строки BSTR в цикле

Мне нужно манипулировать StrVal, так как struct переводится в управляемый C#. Я пытаюсь использовать тип строки BSTR, так как он сохраняет действия по выделению памяти, но я не знаком с неуправляемыми типами данных. Проблема в том, что я не вижу никаких изменений, внесенных в значение.

typedef struct {
    int Id;
    BSTR StrVal;
}packet;

packet pks [5];

// ...

 pks[i].StrVal = L"abcdefghij";

 for (int i = 0; i < 10; i++)
 {
    pks[i]=i;

    //pks[i].StrVal = SysAllocString(L"abcdefghi"+i);
    pks[i].StrVal[9]=i+'0';
 }

Как я могу выполнить задание?


person Avia Afer    schedule 19.10.2015    source источник


Ответы (2)


Измените инициализацию на

pks[i].StrVal = SysAllocString(L"abcdefghij");
person LPs    schedule 19.10.2015
comment
на последнее не обратил внимания (; спасибо! - person Avia Afer; 19.10.2015

Проблема в том, что pks[i].StrVal = L"abcdefghij" просто указывает BSTR на строковый литерал, он не копирует значение в BSTR, в дополнение к тому факту, что BSTR в то время как typedefed к whar_t* не ведет себя как строка C. Для работы с BSTR вы должны ограничить себя набором функций Sys... (например, SysAllocString) или, если доступен ATL, используйте его. Инициализировать и выделить строку;

pks[i].StrVal = SysAllocString(L"abcdefghij");

Глядя только на цикл for (т.е. не выделяя, как указано выше), конкатенацию можно легко выполнить с помощью ATL::CComBSTR;

CComBSTR temp(L"abcdefghi");
temp += std::to_wstring(i).c_str();
pks[i].StrVal = temp.Detach();

VarBstrCat предоставляет еще один альтернативный для конкатенации.

person Niall    schedule 19.10.2015
comment
спасибо за ваш хороший пример кода, я не знаю всех типов, которые вы упомянули, и при рассмотрении альтернативы приятно, что CComBSTR позволяет использовать без выделения. хотя какой подход менее дорог, поскольку я мог бы маршалировать на управляемый код, М из них - person Avia Afer; 19.10.2015