Я пишу 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-интерфейс, или я должен освободить его внутри моей функции? Спасибо!