' com/bstring.ab #require #require Namespace ActiveBasic Namespace COM Class BString Sub Init(s As PCSTR, len As DWord) Dim lenBS = MultiByteToWideChar(CP_THREAD_ACP, 0, s, len As Long, 0, 0) bs = SysAllocStringLen(0, lenBS) MultiByteToWideChar(CP_THREAD_ACP, 0, s, len As Long, bs, lenBS) End Sub Public Sub BString() bs = 0 End Sub Sub BString(len As DWord) bs = SysAllocStringLen(0, len) End Sub Sub BString(ByRef s As BString) Init(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) Init(s, lstrlenA(s)) End Sub Sub BString(s As PCSTR, len As DWord) Dim lenBS = MultiByteToWideChar(CP_THREAD_ACP, 0, s, len As Long, 0, 0) bs = SysAllocStringLen(0, lenBS) MultiByteToWideChar(CP_THREAD_ACP, 0, s, len As Long, bs, lenBS) End Sub Sub BString(ByRef s As String) Init(s.StrPtr, s.Length As DWord) End Sub Sub ~BString() Clear() End Sub Sub Assign(ByRef bstr As BString) Clear() Init(bstr, bstr.Length) End Sub Sub Assign(s As LPCOLESTR) Clear() Init(s, lstrlenW(s)) End Sub Sub AssignFromBStr(bstr As BSTR) Clear() String.Copy(bs, bstr) End Sub Const Function Copy() As BSTR BString.Copy(Copy, bs) End Function Sub Clear() If bs <> 0 Then SysFreeString(bs) bs = 0 End If End Sub Sub Attach(ByRef bstr As BSTR) Clear() BString.Move(bs, bstr) End Sub Function Detach() As BSTR BString.Move(Detach, bs) End Function Function BStr() As BSTR BStr = bs End Function /* Static Function Assgin(bs As BSTR) As BString Assgin = New BString Assgin.Assgin(bs) End Function Static Function Attach(bs As BSTR) As BString Attach = New BString Attach.Attach(bs) End Function */ Const Function Length() As DWord Length = SysStringLen(bs) End Function Const Function Operator [](i As SIZE_T) As OLECHAR #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 Return New String(bs As PCWSTR, Length As Long) End Function Override Function GetHashCode() As Long Return _System_GetHashFromWordArray(bs, Length) End Function Private bs As BSTR Static Sub Copy(ByRef dst As BSTR, ByVal src As BSTR) dst = SysAllocStringLen(src, SysStringLen(src)) End Sub Static Sub Move(ByRef dst As BSTR, ByRef src As BSTR) dst = src src = 0 End Sub End Class End Namespace 'COM End Namespace 'ActiveBasic