2009-10-19 2 views
0

У меня есть «const char * str» с очень длинной строкой. Мне нужно передать его из клиента cpp в .Net COM-метод, который ожидает тип BSTR. В настоящее время я использую:Выделение памяти CComBSTR

CComBSTR bstr = str; 

Это имеет следующие вопросы:

  • Иногда эта линия терпит неудачу с из сообщения памяти
  • Когда я прохожу BSTR к классу COM требуется много памяти (гораздо больше, чем размер строки), поэтому он может не сработать из памяти

Вопросы:

  • Могу ли я конвертировать в CComBSTR? например есть способ использовать кучу или что-то такое?
  • Лучше ли использовать BSTR?

Любое другое предложение также приветствуется ...

ответ

3

Если метод ожидает, что BSTR, проходящий BSTR, является единственным правильным способом.

Для преобразования char* в BSTR вы используете MultiByteToWideChar() Функция Win32 API для преобразования и SysAllocStringLen() для распределения памяти. Вы не можете обойти это - вам нужно SysAllocStringLen() для распределения памяти, потому что иначе COM-сервер потерпит неудачу, если он вызывает SysStringLen().

Когда вы используете CComBSTR и присваиваете ему char*, то эта же последовательность запускается - ATL доступен в виде заголовков, и вы можете наслаждаться чтением, чтобы увидеть, как это работает.Так что фактически CComBSTR выполняет именно минимальный набор необходимых действий.

Когда вы передаете BSTR к COM-серверу CComBSTR::operator BSTR() const называется, который просто возвращает указатель на обернутые BSTR - BSTR тела не копируется. Все, что происходит дальше, зависит от COM-сервера или используемого интерполя - они сами решат, хотят ли они скопировать тело BSTR или просто прочитать его напрямую.

Ваша единственная ставка для устранения перерывов в памяти - это изменение интерфейса COM, чтобы он принимал читателя и запрашивал данные в кусках через этот считыватель.

0

CComBSTR является оберткой BSTR, который, в свою очередь, будет засчитана строкой Unicode с особым прекращением.

Таким образом, вы ожидаете, что он будет примерно в два раза больше соответствующей формы char * (для наборов символов, которые в основном используют однобайтные символы).

Использование CComBSTR - хорошая идея в целом, поскольку деструктор освободит память, связанную с BSTR для вас.

+0

Проблема связана с передачей значения COM-объекту, есть ли еще какие-то неявные дублирования в BSTR? –

1

Является ли это COM-сервером In-Process, у вас есть код для него или это сторонний участник? потому что вы можете передать действительный указатель char * на COM-сервер и не платить цену на размещение + копию + бесплатно. Вам нужно будет добавить новый метод/свойство, доступное только для клиентов C++.


Вместо передачи BSTR вы можете обернуть свой символ * в интерфейсе Stream, сервер .NET должен получить Stream вместо строки.

На стороне C++ реализован COM-класс, поддерживающий COM-интерфейс IStream, этот класс является потоком только для чтения, который обертывает char *, вы можете передать этот класс как интерфейс UCOMIStream на сервер .NET.
На стороне .NET используйте методы UCOMIStream для чтения строки, будьте осторожны, чтобы не читать весь поток за один проход.

+0

как я могу это сделать? подпись показывает мне, что мне нужно передать BSTR. –

+0

Я изменил свой ответ на мою идею. –

+0

сервер находится в .Net и клиент в cpp –

Смежные вопросы