Z książki ATL Internals, wiedziałem, że BSTR różni się od OLECHAR *, i są CComBSTR i CString dla BSTR.Czy mamy traktować typ BSTR w COM jako wartość lub referencję?
Według MSDN Allocating and Releasing Memory for a BSTR, znałem odpowiedzialność za zarządzanie pamięcią dla osoby dzwoniącej/osoby odwiedzającej.
Weź tę linię z MSDN,
HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
ja nadal nie wiem, jak obsługiwać bstr
właściwie w moim realizacji. Ponieważ nadal mam podstawowe pytanie do BSTR-a - powinniśmy traktować bstr
jako wartość (jak int) lub jako odniesienie (jak int *), przynajmniej na granicy interfejsu COM.
Chcę przekonwertować BSTR jak najszybciej do CString/CComBSTR w mojej implementacji. Wartość lub odniesienie semantyczne będą zupełnie inne dla konwersji. Wkopałem się w CComBSTR.Attach, CComBSTR.AssignBSTR itd. Ale kod nie rozwiąże moich wątpliwości.
MSDN CComBSTR.Attach ma wycinek kodu, czuję, że jest źle, ponieważ nie jest on zgodny z Allocating and Releasing Memory for a BSTR. ATL Internals powiedział, że SetSysString "zwolni oryginalny BST przekazany w", jeśli użyłbym go, naruszy to konwencję BSTR, podobnie jak CComBSTR.Attach.
Podsumowując, chcę używać CString do obsługi surowego BSTR w implementacji, ale nie znam prawidłowej metody ... Napisałem trochę kodu do moich projektów, ale zawsze czuję się zdenerwowany, odkąd nie wiem, czy mam rację.
Pozwól mi mówić kodowania językowi
HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
{
// What I do NOT know
CString str1; // 1. copy bstr (with embeded NUL)
CString str2; // 2. ref bstr
// What I know
CComBSTR cbstr1;
cbstr1.AssignBSTR(bstr); // 3. copy bstr
CComBSTR cbstr2;
cbstr2.Attach(bstr); // 4. ref bstr, do not copy
// What I do NOT know
// Should we copy or ref bstr ???
}
Moje pytanie brzmi: Czy powinniśmy skopiować lub odesłać bstr? Małe qeustion jest jak ref Bstr z CString? jak skopiować bstr z wbudowanym NULL? – Raymond
Co masz na myśli z kopią lub ref? Jeśli jest to parametr wejściowy, parametr "BSTR" przez wartość, inny przekaz "przez wskaźnik" 'BSTR *'. Jeśli masz wbudowane 'NUL's, możesz skopiować go w' std :: wstring', a nie w 'CString'. –
Może obserwujesz problem z niewłaściwego punktu widzenia ... Pomyśl o 'BSTR' jak' const wchar_t * 'przydzielonym ze specjalnym przydziałem COM i prefiksem długości (aby mógł on zawierać' NUL's). –