Соглашение о передаче BSTR в функции COM из C # (COM-взаимодействие)

Я пишу API в COM на C ++, а также пишу программу, которая использует этот API на C #. Мой вопрос касается семантики управления памятью BSTR при передаче BSTR в функции COM. Скажем, мой IDL выглядит так:

HRESULT SomeFunction([in] BSTR input);

В настоящее время эта функция реализована так:

HRESULT SomeFunction(BSTR input) {
    // Do stuff ..., then:
    SysFreeString(input);
}

Когда я вызываю ее из C # с чем-то вроде SomeFunction (myString) , C # генерирует что-то вроде этого (псевдокод):

myString = SysAllocString("string");
SomeFunction(myString);

Или, скорее, так:

myString = SysAllocString("string");
SomeFunction(myString);
SysFreeString(myString);

То есть, освобождает ли C # созданный им BSTR для маршалинга в COM-интерфейс, или я должен освободить его внутри моей функции? Спасибо!

9
задан fyhuang 11 August 2011 в 21:54
поделиться