有一个派生自_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());
}
};
答案 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函数执行此操作(例如printf
,CString::Format
)。如果您仍然这样做,MSVC将很乐意将整个_bstr_t
对象推送到堆栈中而不会发出警告。由于_bstr_t
使不具有合适的布局以“解释”为指针,因此它不工作。
(是的,第一个也是唯一一个成员是指针。但它不是指向字符串的指针,它是指向结构的指针,第一个成员是指向字符串的指针。)
同样的事情 与CString
一起使用,因为CString
是专门设计用于允许这种讨厌的伎俩。这并不是说我会推荐这样做。