Index: /Include/com/bstring.ab
===================================================================
--- /Include/com/bstring.ab	(revision 138)
+++ /Include/com/bstring.ab	(revision 138)
@@ -0,0 +1,102 @@
+' com/bstring.ab
+
+#require <ole2.ab>
+#require <oleauto.ab>
+
+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
+
