System.String interop BSTR
От: TopSpace  
Дата: 07.12.10 12:05
Оценка:
Есть C# dll, предназначенная для вызовов из неуправляемого кода через COM (интерфейс и класс):

interface IFoo
{
    string GetResult(string str);
}

public class Foo : IFoo
{
    public string GetResult(string str)
    {
        string result = ....  // создаем объект типа string и возвращаем его как результат
        return result;  
    }
}


При импорте типов метод превращается в следующее:

virtual HRESULT FooNamespace::IFoo::GetResult(BSTR str, BSTR* pRetVal) = 0;



Соответственно, в С++ дергается так:

#import "Foo.tlb" named_guids raw_interfaces_only
....

FooNamespace::IFooPtr pFoo;
HRESULT hRes = pFoo.CreateInstance(FooNamespace::CLSID_Foo);

if (hRes == S_OK)
{
    CComBSTR val = ....;

    BSTR strResult = NULL;  
    pFoo->GetResult(val, &strResult);
    CString result = strResult;
  ...
}
...


Все работает.

Вопрос в том, что происходит с памятью, выделяемой внутри C#-метода. Объект string создается и возвращается в С++, где "превращается" в BSTR. Происходит глубокое копирование, или этот BSTR есть тот же адрес, что и оригинальный string? Но ведь за очистку с одной стороны отвечает GC, с другой — на стороне С++ нужно явно вызвать какую-то очистку..
В общем вопрос, как правильно вернуть строку из C# в С++, чтобы не было никаких ликов и прочих граблей...

заранее спасибо за помощь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.