将_bstr_t复制到wchar_t的正确方法*

时间:2011-04-16 00:26:16

标签: c++

有一个派生自_bstr_t的A类。它需要有一个方法,它接受wchar_t *并将bstr复制到其中。如果wcsncpy_s了解bstrs,这是最安全的方法吗?

class A: public _bstr_t
{
    ----
    ----

    void CopyTo(wchar_t* buf, size_t destinationsize)
    {  
        wcsncpy_s(buf, destinationsize, *this, length());
    }
};

2 个答案:

答案 0 :(得分:1)

我想你想要这个:

void CopyTo(wchar_t* buf, size_t destinationsize) const
{  
   wcsncpy_s(buf, destinationsize, static_cast<wchar_t const *>(this), _TRUNCATE);
}

如果你不使用_TRUNCATE,那么当缓冲区太小而不能包含整个字符串(加上null)时,将调用无效参数处理程序:

http://msdn.microsoft.com/en-us/library/ksazx244%28v=vs.80%29.aspx

答案 1 :(得分:0)

你的代码很好。 wcsncpy_s无法“理解”_bstr_t。但它会“理解”wchar_t const*_bstr_t具有合适的转换运算符:

class _bstr_t {
public:
// ...
    // Extractors
    //
    operator const wchar_t*() const throw();
    operator wchar_t*() const throw();
    operator const char*() const ;
    operator char*() const ;

请注意不要对任何varargs函数执行此操作(例如printfCString::Format)。如果您仍然这样做,MSVC将很乐意将整个_bstr_t对象推送到堆栈中而不会发出警告。由于_bstr_t使具有合适的布局以“解释”为指针,因此它工作。 (是的,第一个也是唯一一个成员是指针。但它不是指向字符串的指针,它是指向结构的指针,第一个成员是指向字符串的指针。)

同样的事情 CString一起使用,因为CString是专门设计用于允许这种讨厌的伎俩。这并不是说我会推荐这样做。