Tôi đang viết một API trong COM trong C++, và cũng viết một chương trình tiêu thụ API này trong C#. Câu hỏi của tôi là về ngữ nghĩa quản lý bộ nhớ BSTR khi chuyển BSTR vào các hàm COM. Nói IDL của tôi trông giống như:Công ước để chuyển BSTR vào các hàm COM từ C# (COM interop)
HRESULT SomeFunction([in] BSTR input);
Hiện tại chức năng này được thực hiện như thế này:
HRESULT SomeFunction(BSTR input) {
// Do stuff ..., then:
SysFreeString(input);
}
Khi tôi gọi nó từ C# với một cái gì đó giống như SomeFunction(myString)
, sẽ C# tạo ra một cái gì đó như thế này (giả):
myString = SysAllocString("string");
SomeFunction(myString);
Hay đúng hơn là như thế này:
myString = SysAllocString("string");
SomeFunction(myString);
SysFreeString(myString);
Tức là, không C# miễn phí BSTR mà nó tạo ra để so sánh với giao diện COM, hoặc tôi nên giải phóng nó bên trong chức năng của tôi? Cảm ơn!
Câu trả lời này không liên quan gì đến những gì CLR tự động thực hiện cho interop, đó là tất cả các OP đang hỏi về. – ildjarn
@ildjarn: ngược lại, nó trả lời chính xác câu hỏi của OP. –
@Alf: Nói đúng câu trả lời vì lý do sai và ngữ cảnh sai và liên kết không thực sự "đúng". – ildjarn