CComBSTR

此类是 BSTR 的包装器。

语法

class CComBSTR

成员

公共构造函数

名称 描述
CComBSTR::CComBSTR 构造函数。
CComBSTR::~CComBSTR 析构函数。

公共方法

名称 描述
CComBSTR::Append 将字符串追加到 m_str
CComBSTR::AppendBSTR BSTR 追加到 m_str
CComBSTR::AppendBytes 将指定数量的字节追加到 m_str
CComBSTR::ArrayToBSTR 从 safearray 中每个元素的第一个字符创建 BSTR 并将其附加到 CComBSTR 对象。
CComBSTR::AssignBSTR BSTR 分配到 m_str
CComBSTR::Attach BSTR 附加到 CComBSTR 对象。
CComBSTR::BSTRToArray 创建一个从零开始的一维 safearray,该数组的每个元素是 CComBSTR 对象中的一个字符。
CComBSTR::ByteLength 返回 m_str 的长度(以字节为单位)。
CComBSTR::Copy 返回 m_str 的副本。
CComBSTR::CopyTo 通过 [out] 参数返回 m_str 的副本
CComBSTR::Detach CComBSTR 对象中分离 m_str
CComBSTR::Empty 释放 m_str
CComBSTR::Length 返回 m_str 的长度。
CComBSTR::LoadString 加载字符串资源。
CComBSTR::ReadFromStream 从流加载 BSTR 对象。
CComBSTR::ToLower 将字符串转换为小写。
CComBSTR::ToUpper 将字符串转换为大写。
CComBSTR::WriteToStream m_str 保存到流。

公共运算符

“属性” 描述
CComBSTR::operator BSTR CComBSTR 对象强制转换为 BSTR。
CComBSTR::operator ! 根据 m_str 是否为 NULL 返回 TRUE 或 FALSE。
CComBSTR::operator != CComBSTR 与某个字符串进行比较。
CComBSTR::operator & 返回 m_str 的地址。
CComBSTR::operator += CComBSTR 追加到对象。
CComBSTR::operator < CComBSTR 与某个字符串进行比较。
CComBSTR::operator = m_str 赋值。
CComBSTR::operator == CComBSTR 与某个字符串进行比较。
CComBSTR::operator > CComBSTR 与某个字符串进行比较。

公共数据成员

“属性” 描述
CComBSTR::m_str 包含与 CComBSTR 对象关联的 BSTR

注解

CComBSTR 类是 BSTR(以长度为前缀的字符串)的包装器。 该长度作为整数存储在字符串中数据前面的内存位置。

BSTR 在最后一个计数字符之后以 null 结尾,但也可能包含嵌入在字符串中的 null 字符。 字符串长度由字符计数而不是第一个 null 字符确定。

注意

CComBSTR 类提供许多将 ANSI 或 Unicode 字符串用作参数的成员(构造函数、赋值运算符和比较运算符)。 这些函数的 ANSI 版本不如其对应的 Unicode 版本那样高效,因为临时 Unicode 字符串通常是在内部创建的。 为确保效率,请尽可能使用 Unicode 版本。

注意

由于 Visual Studio .NET 中实现的查找行为已得到改进,在先前版本中编译的 bstr = L"String2" + bstr; 等代码应实现为 bstr = CStringW(L"String2") + bstr

有关使用 CComBSTR 时的注意事项列表,请参阅使用 CComBSTR 编程

要求

标头atlbase.h

CComBSTR::Append

lpszbstrSrc 的 BSTR 成员追加到 m_str

HRESULT Append(const CComBSTR& bstrSrc) throw();
HRESULT Append(wchar_t ch) throw();
HRESULT Append(char ch) throw();
HRESULT Append(LPCOLESTR lpsz) throw();
HRESULT Append(LPCSTR lpsz) throw();
HRESULT Append(LPCOLESTR lpsz, int nLen) throw();

参数

bstrSrc
[in] 要追加的 CComBSTR 对象。

ch
[in] 要追加的字符。

lpsz
[in] 要追加的以零结尾的字符串。 可以通过 LPCOLESTR 重载传递 Unicode 字符串,或通过 LPCSTR 版本传递 ANSI 字符串。

nLen
[in] lpsz 中要追加的字符数。

返回值

返回 S_OK(如果成功),或返回任何标准 HRESULT 错误值。

备注

在追加 ANSI 字符串之前会将其转换为 Unicode。

示例

enum { urlASP, urlHTM, urlISAPI } urlType;
urlType = urlASP;

CComBSTR bstrURL = OLESTR("http://SomeSite/");
CComBSTR bstrDEF = OLESTR("/OtherSite");
CComBSTR bstrASP = OLESTR("default.asp");

CComBSTR bstrTemp;
HRESULT hr;

switch (urlType)
{
case urlASP:
   // bstrURL is 'http://SomeSite/default.asp'
   hr = bstrURL.Append(bstrASP);
   break;

case urlHTM:
   // bstrURL is 'http://SomeSite/default.htm'
   hr = bstrURL.Append(OLESTR("default.htm"));
   break;

case urlISAPI:
   // bstrURL is 'http://SomeSite/default.dll?func'
   hr = bstrURL.Append(OLESTR("default.dll?func"));
   break;

default:
   // bstrTemp is 'http://'
   hr = bstrTemp.Append(bstrURL, 7);
   // bstrURL is 'http://OtherSite'
   if (hr == S_OK)
       hr = bstrTemp.Append(bstrDEF);
   bstrURL = bstrTemp;

   break;
}

CComBSTR::AppendBSTR

将指定的 BSTR 追加到 m_str

HRESULT AppendBSTR(BSTR p) throw();

参数

p
[in] 要追加的 BSTR

返回值

返回 S_OK(如果成功),或返回任何标准 HRESULT 错误值。

备注

不要将普通宽字符串传递给此方法。 编译器无法捕获错误,并且会发生运行时错误。

示例

CComBSTR bstrPre(OLESTR("Hello "));
CComBSTR bstrSuf(OLESTR("World!"));
HRESULT hr;

// Appends "World!" to "Hello "
hr = bstrPre.AppendBSTR(bstrSuf);

// Displays a message box with text "Hello World!"
::MessageBox(NULL, CW2CT(bstrPre), NULL, MB_OK);   

CComBSTR::AppendBytes

在不进行转换的情况下将指定数量的字节追加到 m_str

HRESULT AppendBytes(const char* lpsz, int nLen) throw();

参数

lpsz
[in] 指向要追加的字节数组的指针。

p
[in] 要追加的字节数。

返回值

返回 S_OK(如果成功),或返回任何标准 HRESULT 错误值。

示例

CComBSTR bstrPre(OLESTR("Hello "));
HRESULT hr;

// Appends "Wo" to "Hello " (4 bytes == 2 characters)
hr = bstrPre.AppendBytes(reinterpret_cast<char*>(OLESTR("World!")), 4);

// Displays a message box with text "Hello Wo"
::MessageBox(NULL, CW2CT(bstrPre), NULL, MB_OK);   

CComBSTR::ArrayToBSTR

释放 CComBSTR 对象中保存的任何现有字符串,然后从 safearray 中每个元素的第一个字符创建 BSTR 并将其附加到 CComBSTR 对象。

HRESULT ArrayToBSTR(const SAFEARRAY* pSrc) throw();

参数

pSrc
[in] 包含用于创建字符串的元素的 safearray。

返回值

返回 S_OK(如果成功),或返回任何标准 HRESULT 错误值。

CComBSTR::AssignBSTR

BSTR 分配到 m_str

HRESULT AssignBSTR(const BSTR bstrSrc) throw();

参数

bstrSrc
[in] 要分配到当前 CComBSTR 对象的 BSTR。

返回值

返回 S_OK(如果成功),或返回任何标准 HRESULT 错误值。

CComBSTR::Attach

通过将 m_str 成员设置为 src,将 BSTR 附加到 CComBSTR 对象。

void Attach(BSTR src) throw();

参数

src
[in] 要附加到对象的 BSTR

注解

不要将普通宽字符串传递给此方法。 编译器无法捕获错误,并且会发生运行时错误。

注意

此方法将断言 m_str 是否不为 NULL。

示例

// STDMETHOD(BSTRToUpper)(/*[in, out]*/ BSTR bstrConv);
STDMETHODIMP InplaceBSTRToUpper(BSTR bstrConv)
{
   // Assign bstrConv to m_str member of CComBSTR
   CComBSTR bstrTemp;
   bstrTemp.Attach(bstrConv); 

   // Make sure BSTR is not NULL string
   if (!bstrTemp)
        return E_POINTER;

   // Make string uppercase 
   HRESULT hr;
   hr = bstrTemp.ToUpper();
   if (hr != S_OK)
       return hr;

   // Set m_str to NULL, so the BSTR is not freed
   bstrTemp.Detach(); 

   return S_OK; 
}

CComBSTR::BSTRToArray

创建一个从零开始的一维 safearray,该数组的每个元素是 CComBSTR 对象中的一个字符。

HRESULT BSTRToArray(LPSAFEARRAY* ppArray) throw();

参数

ppArray
[out] 指向用于保存函数结果的 safearray 的指针。

返回值

返回 S_OK(如果成功),或返回任何标准 HRESULT 错误值。

CComBSTR::ByteLength

返回 m_str 中的字节数,不包括结尾的 null 字符。

unsigned int ByteLength() const throw();

返回值

m_str 成员的长度(以字节为单位)。

备注

如果 m_strNULL,则返回 0。

示例

// string with 11 chars (22 bytes)
CComBSTR bstrTemp(OLESTR("Hello World"));

unsigned int len = bstrTemp.ByteLength();

ATLASSERT(len == 22);   

CComBSTR::CComBSTR

构造函数。 默认构造函数将 m_str 成员设置为 NULL

CComBSTR() throw();
CComBSTR(const CComBSTR& src);
CComBSTR(REFGUID  guid);
CComBSTR(int nSize);
CComBSTR(int nSize, LPCOLESTR sz);
CComBSTR(int nSize, LPCSTR sz);
CComBSTR(LPCOLESTR pSrc);
CComBSTR(LPCSTR pSrc);
CComBSTR(CComBSTR&& src) throw(); // (Visual Studio 2017)

参数

nSize
[in] 要从 sz 复制的字符数,或 CComBSTR 的字符的初始大小。

sz
[in] 要复制的一个字符串。 Unicode 版本指定 LPCOLESTR;ANSI 版本指定 LPCSTR。

pSrc
[in] 要复制的一个字符串。 Unicode 版本指定 LPCOLESTR;ANSI 版本指定 LPCSTR。

src
[in] 一个 CComBSTR 对象。

guid
[in] 对 GUID 结构的引用。

备注

复制构造函数将 m_str 设置为 src 的 BSTR 成员的副本。 REFGUID 构造函数使用 StringFromGUID2 将 GUID 转换为字符串并存储结果。

其他构造函数将 m_str 设置为指定字符串的副本。 如果传递 nSize 的值,则只会复制 nSize 字符,后接一个结尾 null 字符。

CComBSTR 支持移动语义。 可以使用移动构造函数(采用右值引用 (&&) 来创建新对象的构造函数,该新对象使用与你作为自变量传入的旧对象相同的基础数据,而无需复制对象的开销。

析构函数释放由 m_str 指向的字符串。

示例

CComBSTR bstr1;   // BSTR points to NULL
bstr1 = "Bye";    // initialize with assignment operator
                  // ANSI string is converted to wide char

OLECHAR* str = OLESTR("Bye bye!");  // wide char string of length 5
int len = (int)wcslen(str);
CComBSTR bstr2(len + 1);// unintialized BSTR of length 6
wcsncpy_s(bstr2.m_str, bstr2.Length(), str, len); // copy wide char string to BSTR

CComBSTR bstr3(5, OLESTR("Hello World")); // BSTR containing 'Hello', 
                                          // input string is wide char
CComBSTR bstr4(5, "Hello World");         // same as above, input string 
                                          // is ANSI

CComBSTR bstr5(OLESTR("Hey there")); // BSTR containing 'Hey there', 
                                     // input string is wide char
CComBSTR bstr6("Hey there");         // same as above, input string 
                                     // is ANSI

CComBSTR bstr7(bstr6);     // copy constructor, bstr7 contains 'Hey there'   

CComBSTR::~CComBSTR

析构函数。

~CComBSTR();

备注

析构函数释放由 m_str 指向的字符串。

CComBSTR::Copy

分配并返回 m_str 的副本。

BSTR Copy() const throw();

返回值

m_str 成员的副本。 如果 m_strNULL,则返回 NULL

示例

CComBSTR m_bstrURL;    // BSTR representing a URL

// put_URL is the put method for the URL property. 
STDMETHOD(put_URL)(BSTR strURL)
{
    ATLTRACE(_T("put_URL\n"));

    // free existing string in m_bstrURL & make a copy 
    // of strURL pointed to by m_bstrURL
    m_bstrURL = strURL;
    return S_OK;
}

// get_URL is the get method for the URL property. 
STDMETHOD(get_URL)(BSTR* pstrURL)
{
    ATLTRACE(_T("get_URL\n"));

    // make a copy of m_bstrURL pointed to by pstrURL
    *pstrURL = m_bstrURL.Copy(); // See CComBSTR::CopyTo
    return S_OK;
}

CComBSTR::CopyTo

通过参数分配并返回 m_str 的副本。

HRESULT CopyTo(BSTR* pbstr) throw();

HRESULT CopyTo(VARIANT* pvarDest) throw();

参数

pbstr
[out] 要在其中返回此方法分配的字符串的 BSTR 的地址。

pvarDest
[out] 要在其中返回此方法分配的字符串的 VARIANT 的地址。

返回值

指示复制成功或失败结果的标准 HRESULT 值。

注解

调用此方法后,pvarDest 指向的 VARIANT 的类型将是 VT_BSTR

示例

CComBSTR m_bstrURL; // BSTR representing a URL

// get_URL is the get method for the URL property. 
STDMETHOD(get_URL)(BSTR* pstrURL)
{
   // Make a copy of m_bstrURL and return it via pstrURL
   return m_bstrURL.CopyTo(pstrURL);
}

CComBSTR::Detach

CComBSTR 对象中分离 m_str 并将 m_str 设置为 NULL

BSTR Detach() throw();

返回值

BSTR 对象关联的 CComBSTR

示例

// Method which converts bstrIn to uppercase 
STDMETHODIMP BSTRToUpper(BSTR bstrIn, BSTR* pbstrOut)
{ 
    if (bstrIn == NULL || pbstrOut == NULL) 
        return E_POINTER; 

    // Create a temporary copy of bstrIn
    CComBSTR bstrTemp(bstrIn); 

    if (!bstrTemp) 
        return E_OUTOFMEMORY; 

    // Make string uppercase
    HRESULT hr;
    hr = bstrTemp.ToUpper();
    if (hr != S_OK)
        return hr;
    
    // Return m_str member of bstrTemp 
    *pbstrOut = bstrTemp.Detach(); 

    return S_OK; 
}

CComBSTR::Empty

释放 m_str 成员。

void Empty() throw();

示例

CComBSTR bstr(OLESTR("abc"));

// Calls SysFreeString to free the BSTR
bstr.Empty();
ATLASSERT(bstr.Length() == 0);   

CComBSTR::Length

返回 m_str 中的字符数,不包括结尾的 null 字符。

unsigned int Length() const throw();

返回值

m_str 成员的长度。

示例

// string with 11 chars
CComBSTR bstrTemp(OLESTR("Hello World"));

unsigned int len = bstrTemp.Length();

ATLASSERT(len == 11);

CComBSTR::LoadString

加载 nID 指定的字符串资源并将其存储在此对象中。

bool LoadString(HINSTANCE hInst, UINT nID) throw();
bool LoadString(UINT nID) throw();

参数

请参阅 Windows SDK 中的LoadString

返回值

如果字符串加载成功,则返回 TRUE;否则返回 FALSE

注解

第一个函数通过 hInst 参数从你标识的模块加载资源。 第二个函数从与此项目中使用的 CComModule 派生对象关联的资源模块加载资源。

示例

CComBSTR bstrTemp;

// IDS_PROJNAME proj name stored as resource in string table
bstrTemp.LoadString(IDS_PROJNAME);

// the above is equivalent to:
// bstrTemp.LoadString(_Module.m_hInstResource, IDS_PROJNAME);

// display message box w/ proj name as title & text
::MessageBox(NULL, CW2CT(bstrTemp), CW2CT(bstrTemp), MB_OK);   

CComBSTR::m_str

包含与 CComBSTR 对象关联的 BSTR

BSTR m_str;

示例

CComBSTR GuidToBSTR(REFGUID guid) 
{
    // 39 - length of string representation of GUID + 1
    CComBSTR b(39); 

    // Convert GUID to BSTR
    // m_str member of CComBSTR is of type BSTR. When BSTR param 
    // is required, pass the m_str member explicitly or use implicit 
    // BSTR cast operator.
    int nRet = StringFromGUID2(guid, b.m_str, 39); 

    // Above equivalent to:
    // int nRet = StringFromGUID2(guid, b, 39); 
    // implicit BSTR cast operator used for 2nd param

    // Both lines are equivalent to:
    // CComBSTR b(guid);
    // CComBSTR constructor can convert GUIDs

    ATLASSERT(nRet); 
    return b; 
}

CComBSTR::operator BSTR

CComBSTR 对象强制转换为 BSTR

operator BSTR() const throw();

备注

允许将 CComBSTR 对象传递给具有 [in] BSTR 参数的函数

示例

请参阅 CComBSTR::m_str 的示例。

CComBSTR::operator !

检查 BSTR 字符串是否为 NULL

bool operator!() const throw();

返回值

如果 m_str 成员是 NULL,则返回 TRUE;否则返回 FALSE

注解

此运算符仅检查 NULL 值,而不检查空字符串。

示例

// STDMETHOD(BSTRToUpper)(/*[in, out]*/ BSTR bstrConv);
STDMETHODIMP InplaceBSTRToUpper(BSTR bstrConv)
{
   // Assign bstrConv to m_str member of CComBSTR
   CComBSTR bstrTemp;
   bstrTemp.Attach(bstrConv); 

   // Make sure BSTR is not NULL string
   if (!bstrTemp)
        return E_POINTER;

   // Make string uppercase 
   HRESULT hr;
   hr = bstrTemp.ToUpper();
   if (hr != S_OK)
       return hr;

   // Set m_str to NULL, so the BSTR is not freed
   bstrTemp.Detach(); 

   return S_OK; 
}

CComBSTR::operator !=

返回 operator == 的逻辑求反结果。

bool operator!= (const CComBSTR& bstrSrc) const throw();
bool operator!= (LPCOLESTR pszSrc) const;
bool operator!= (LPCSTR pszSrc) const;
bool operator!= (int nNull) const throw();

参数

bstrSrc
[in] 一个 CComBSTR 对象。

pszSrc
[in] 一个以零结尾的字符串。

nNull
[in] 必须为 NULL。

返回值

如果所要比较的项不等于 CComBSTR 对象,则返回 TRUE;否则返回 FALSE

注解

在用户的默认区域设置上下文中对 CComBSTR 进行文本比较。 最后的比较运算符只会将包含的字符串与 NULL 进行比较。

CComBSTR::operator &

返回存储在 m_str 成员中的 BSTR 的地址。

BSTR* operator&() throw();

备注

CComBstr operator & 有一个关联的特殊断言用于帮助识别内存泄漏。 程序将在初始化 m_str 成员时断言。 创建此断言是为了识别编程器使用 & operatorm_str 成员赋新值且不释放 m_str 的首次分配的情况。 如果 m_str 等于 NULL,则程序假设 m_str 尚未分配。 在这种情况下,程序不会断言。

默认未启用此断言。 定义 ATL_CCOMBSTR_ADDRESS_OF_ASSERT 以启用此断言。

示例

#define ATL_NO_CCOMBSTR_ADDRESS_OF_ASSERT

void MyInitFunction(BSTR* pbstr)
{
   ::SysReAllocString(pbstr, OLESTR("Hello World"));
   return;
}
CComBSTR bstrStr ;
// bstrStr is not initialized so this call will not assert.
MyInitFunction(&bstrStr); 

CComBSTR bstrStr2(OLESTR("Hello World"));
// bstrStr2 is initialized so this call will assert.
::SysReAllocString(&bstrStr2, OLESTR("Bye"));

CComBSTR::operator +=

将字符串追加到 CComBSTR 对象。

CComBSTR& operator+= (const CComBSTR& bstrSrc);
CComBSTR& operator+= (const LPCOLESTR pszSrc);

参数

bstrSrc
[in] 要追加的 CComBSTR 对象。

pszSrc
[in] 要追加的以零结尾的字符串。

备注

在用户的默认区域设置上下文中对 CComBSTR 进行文本比较。 LPCOLESTR 比较是使用 memcmp 对每个字符串中的原始数据执行的。 创建 pszSrc 的临时 Unicode 副本后,将以相同的方式执行 LPCSTR 比较。 最后的比较运算符只会将包含的字符串与 NULL 进行比较。

示例

CComBSTR bstrPre(OLESTR("Hello "));
CComBSTR bstrSuf(OLESTR("World!"));

// Appends "World!" to "Hello "
bstrPre += bstrSuf;

// Displays a message box with text "Hello World!"
::MessageBox(NULL, CW2CT(bstrPre), NULL, MB_OK);   

CComBSTR::operator <

CComBSTR 与某个字符串进行比较。

bool operator<(const CComBSTR& bstrSrc) const throw();
bool operator<(LPCOLESTR pszSrc) const throw();
bool operator<(LPCSTR pszSrc) const throw();

返回值

如果所要比较的项小于 CComBSTR 对象,则返回 TRUE;否则返回 FALSE

备注

使用用户的默认区域设置执行比较。

CComBSTR::operator =

m_str 成员设置为 pSrc 的副本,或 srcBSTR 成员的副本。 移动赋值运算符移动 src 而不复制它。

CComBSTR& operator= (const CComBSTR& src);
CComBSTR& operator= (LPCOLESTR pSrc);
CComBSTR& operator= (LPCSTR pSrc);
CComBSTR& operator= (CComBSTR&& src) throw(); // (Visual Studio 2017)

注解

pSrc 参数为 Unicode 版本指定 LPCOLESTR,或为 ANSI 版本指定 LPCSTR

示例

请参阅 CComBSTR::Copy 的示例。

CComBSTR::operator ==

CComBSTR 与某个字符串进行比较。 在用户的默认区域设置上下文中对 CComBSTR 进行文本比较。

bool operator== (const CComBSTR& bstrSrc) const throw();
bool operator== (LPCOLESTR pszSrc) const;
bool operator== (LPCSTR pszSrc) const;
bool operator== (int nNull) const throw();

参数

bstrSrc
[in] 一个 CComBSTR 对象。

pszSrc
[in] 一个以零结尾的字符串。

nNull
[in] 必须为 NULL

返回值

如果所要比较的项等于 CComBSTR 对象,则返回 TRUE;否则返回 FALSE

备注

最后的比较运算符只会将包含的字符串与 NULL 进行比较。

CComBSTR::operator >

CComBSTR 与某个字符串进行比较。

bool operator>(const CComBSTR& bstrSrc) const throw();

返回值

如果所要比较的项大于 CComBSTR 对象,则返回 TRUE;否则返回 FALSE

备注

使用用户的默认区域设置执行比较。

CComBSTR::ReadFromStream

m_str 成员设置为指定的流中包含的 BSTR

HRESULT ReadFromStream(IStream* pStream) throw();

参数

pStream
[in] 指向包含数据的流中的 IStream 接口的指针。

返回值

标准 HRESULT 值。

备注

ReadToStream 要求位于当前位置的流内容与通过 WriteToStream 调用写出的数据格式兼容。

示例

IDataObject* pDataObj;

// Fill in the FORMATETC struct to retrieve desired format 
// from clipboard
FORMATETC formatetcIn = {CF_TEXT, NULL, DVASPECT_CONTENT, -1, TYMED_ISTREAM};
STGMEDIUM medium;
ZeroMemory(&medium, sizeof(STGMEDIUM));

// Get IDataObject from clipboard
HRESULT hr = ::OleGetClipboard(&pDataObj);

// Retrieve data from clipboard
hr = pDataObj->GetData(&formatetcIn, &medium);

if (SUCCEEDED(hr) && medium.tymed == TYMED_ISTREAM)
{
   CComBSTR bstrStr;
   // Get BSTR out of the stream
   hr = bstrStr.ReadFromStream(medium.pstm);

   //release the stream
   ::ReleaseStgMedium(&medium);
}

CComBSTR::ToLower

将包含的字符串转换为小写。

HRESULT ToLower() throw();

返回值

标准 HRESULT 值。

备注

有关如何执行转换的详细信息,请参阅 CharLowerBuff

CComBSTR::ToUpper

将包含的字符串转换为大写。

HRESULT ToUpper() throw();

返回值

标准 HRESULT 值。

备注

有关如何执行转换的详细信息,请参阅 CharUpperBuff

CComBSTR::WriteToStream

m_str 成员保存到流。

HRESULT WriteToStream(IStream* pStream) throw();

参数

pStream
[in] 指向流中 IStream 接口的指针。

返回值

标准 HRESULT 值。

备注

可以使用 ReadFromStream 函数从流的内容重新创建 BSTR

示例

//implementation of IDataObject::GetData()
STDMETHODIMP CMyDataObj::GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium)
{
    HRESULT hr = S_OK;
    if (pformatetcIn->cfFormat == CF_TEXT && pformatetcIn->tymed == TYMED_ISTREAM)
    {
        IStream *pStm;
        // Create an IStream from global memory
        hr = CreateStreamOnHGlobal(NULL, TRUE, &pStm);
        if (FAILED(hr))
            return hr;

        // Initialize CComBSTR
        CComBSTR bstrStr = OLESTR("Hello World");

        // Serialize string into stream
        // the length followed by actual string is serialized into stream
        hr = bstrStr.WriteToStream(pStm);

        // Pass the IStream pointer back through STGMEDIUM struct
        pmedium->tymed = TYMED_ISTREAM;
        pmedium->pstm = pStm;
        pmedium->pUnkForRelease = NULL; 
    }

    return hr;
}

另请参阅

类概述
ATL 和 MFC 字符串转换宏