Index: trunk/src/VBox/Main/ProgressImpl.cpp
===================================================================
--- trunk/src/VBox/Main/ProgressImpl.cpp	(revision 356)
+++ trunk/src/VBox/Main/ProgressImpl.cpp	(revision 357)
@@ -839,4 +839,28 @@
                                   const char *aText, ...)
 {
+    va_list args;
+    va_start (args, aText);
+    Bstr text = Utf8StrFmt (aText, args);
+    va_end (args);
+    
+    return notifyCompleteBstr (aResultCode, aIID, aComponent, text);
+}
+
+/**
+ *  Marks the operation as complete and attaches full error info.
+ *  See VirtualBoxSupportErrorInfoImpl::setError(HRESULT, const GUID &, const wchar_t *, const char *, ...)
+ *  for more info.
+ *
+ *  This method is preferred iy you have a ready (translated and formatted)
+ *  Bstr string, because it omits an extra conversion Utf8Str -> Bstr.
+ * 
+ *  @param  aResultCode operation result (error) code, must not be S_OK
+ *  @param  aIID        IID of the intrface that defines the error
+ *  @param  aComponent  name of the component that generates the error
+ *  @param  aText       error message (must not be null)
+ */
+HRESULT Progress::notifyCompleteBstr (HRESULT aResultCode, const GUID &aIID,
+                                      const Bstr &aComponent, const Bstr &aText)
+{
     AutoLock lock (this);
     AssertReturn (isReady(), E_UNEXPECTED);
@@ -852,9 +876,5 @@
     if (SUCCEEDED (rc))
     {
-        va_list args;
-        va_start (args, aText);
-        Bstr bstrText = Utf8StrFmt (aText, args);
-        va_end (args);
-        errorInfo->init (aResultCode, aIID, aComponent, bstrText);
+        errorInfo->init (aResultCode, aIID, aComponent, aText);
         errorInfo.queryInterfaceTo (mErrorInfo.asOutParam());
     }
Index: trunk/src/VBox/Main/include/ProgressImpl.h
===================================================================
--- trunk/src/VBox/Main/include/ProgressImpl.h	(revision 356)
+++ trunk/src/VBox/Main/include/ProgressImpl.h	(revision 357)
@@ -182,4 +182,6 @@
                             const Bstr &aComponent,
                             const char *aText, ...);
+    HRESULT notifyCompleteBstr (HRESULT aResultCode, const GUID &aIID,
+                                const Bstr &aComponent, const Bstr &aText);
 
 private:
Index: trunk/src/VBox/Main/include/VirtualBoxBase.h
===================================================================
--- trunk/src/VBox/Main/include/VirtualBoxBase.h	(revision 356)
+++ trunk/src/VBox/Main/include/VirtualBoxBase.h	(revision 357)
@@ -1214,19 +1214,5 @@
      *
      *  See #setError (HRESULT, const GUID &, const wchar_t *, const char *text, ...)
-     *  for details.
-     *
-     *  This method is the most common (and convenient) way  to set error
-     *  information from within interface methods. A typical pattern of usage
-     *  is looks like this:
-     *
-     *  <code>
-     *      return setErrorV (E_FAIL, pszFormat, args);
-     *  </code>
-     *  or
-     *  <code>
-     *      HRESULT rc = setErrorV (E_FAIL, pszFormat, args);
-     *      ...
-     *      return rc;
-     *  </code>
+     *  and #setError (HRESULT, const char *, ...)  for details.
      */
     inline static HRESULT setErrorV (HRESULT resultCode, const char *text, va_list args)
@@ -1234,4 +1220,23 @@
         HRESULT rc = VirtualBoxSupportErrorInfoImplBase::setError (
             resultCode, COM_IIDOF(I), C::getComponentName(), text, args);
+        return rc;
+    }
+
+    /**
+     *  Sets the error information for the current thread, BStr variant.
+     *  A convenience method that automatically sets the default interface
+     *  ID (taken from the I template argument) and the component name
+     *  (a value of C::getComponentName()).
+     *
+     *  This method is preferred iy you have a ready (translated and formatted)
+     *  Bstr string, because it omits an extra conversion Utf8Str -> Bstr. 
+     *
+     *  See #setError (HRESULT, const GUID &, const wchar_t *, const char *text, ...)
+     *  and #setError (HRESULT, const char *, ...)  for details.
+     */
+    inline static HRESULT setErrorBstr (HRESULT resultCode, const Bstr &text)
+    {
+        HRESULT rc = VirtualBoxSupportErrorInfoImplBase::setError (
+            resultCode, COM_IIDOF(I), C::getComponentName(), text);
         return rc;
     }
