' com/bstring.ab #require #require Class BString Public Sub BString() bs = 0 End Sub Sub BString(len As DWord) bs = SysAllocStringLen(len) End Sub Sub BString(ByRef s As BString) BString(s.bs, s.Length) End Sub Sub BString(s As LPCOLESTR) bs = SysAllocString(s) End Sub Sub BString(s As LPCOLESTR, len As DWord) bs = SysAllocStringLen(s, len) End Sub Sub BString(s As PCSTR) BString(s, lstrlenA(s)) End Sub Sub BString(s As PCSTR, len As DWord) Dim lenBS = MultiByteToWideChar(CP_THREAD_ACP, 0, s, len, 0, 0) bs = SysAllocStringLen(0, lenBS) MultiByteToWideChar(CP_THREAD_ACP, 0, s, len, bs, lenBS) End Sub Sub BString(ByRef s As String) BString(s.StrPtr, s.Length As DWord) End Sub Sub Operator =(ByRef bstr As BString) ~BString() BString(bstr) End Sub Sub ~BString() Clear() End Sub Sub Clear() If bs <> 0 Then SysFreeString(bs) bs = 0 End If End Sub Sub Attach(bstr As BSTR) Clear() bs = bstr End Sub Function Detach() As BSTR Detach = bs bs = 0 End Function Function BStr() As BSTR BStr = bs End Function Const Function Length() As DWord Length = SysStringLen(bs) End Function Const Function Operator [](i As SIZE_T) #ifdef _DEBUG If i > Length Then 'Throw OutOfRangeException End If #endif Return bs[i] End Function Sub Operator []=(i As SIZE_T, c As OLECHAR) #ifdef _DEBUG If i > Length Then 'Throw OutOfRangeException End If #endif bs[i] = c End Sub Override Function ToString() As String Dim s As String(bs, Length) Return s End Function Private bs As BSTR End Class