【发布时间】:2014-01-05 23:20:52
【问题描述】:
根据一些较早的 StackOverflow 问题(Unable to pass std::wstring across DLL、C++ DLL returning pointer to std::list<std::wstring>),C++ DLL 返回 std::wstring 是不安全的,因为不能保证主程序具有相同的 std::wstring 定义,因此它可能会导致崩溃。
但是,在 http://en.cppreference.com/w/cpp/string/basic_string 中,似乎 std::wstring 现在可以与 WCHAR 数组互换使用:
(C++11 起) basic_string 的元素是连续存储的,即对于 basic_string s,&*(s.begin() + n) == &*s.begin() + n 对于 [0, s.size( )),或者等效地,可以将指向 s[0] 的指针传递给期望指向 CharT[] 数组的第一个元素的指针的函数。
我已经通过将&s[0] 传递给预期WCHAR* 缓冲区的WINAPI 函数对此进行了测试,并且它似乎可以工作(std::wstring 已正确填充了WINAPI 的结果)。因此,既然std::wstring 现在显然可以被视为WCHAR 数组,我决定重新审视这个问题:可以从DLL 安全地返回std::wstring 吗?为什么或为什么不?
【问题讨论】: