【发布时间】:2018-06-24 07:17:09
【问题描述】:
我正在尝试挂钩在 Visual Studio 2005 中编码的旧游戏的功能。
该函数使用std::wstring,由于我使用的是vs 2017,由于某种原因该函数根本不读取它。
我想知道 Visual Studio 2005 和 2017 中宽字符串的区别。以及如何在 Visual Studio 2017 中使用 Visual Studio 2005 宽字符串?
注意:钩子代码在 vs 2005 中运行良好。
提前致谢,致以最诚挚的问候。
更新 #1:一位朋友从他的 vs 2005 向我发送了宽字符串类,但它仍然缺少 const wchar_t* 构造函数
namespace std {
class wstring {
void *allocator;
union {
wchar_t buffer[8];
wchar_t* p_buffer
} _myData;
int size;
int reserved_size;
};
}
【问题讨论】:
-
std::wstring是 C-runtime 的一部分,自 2005 年以来显然发生了变化。您是否尝试过使用旧的 C-runtime 编译代码? -
是的,它成功了,但我必须使用 v141 工具集编译它,因为我的项目不仅仅是这个钩子,而且项目中有很多功能需要 v141 工具集。
-
我认为这种组合行不通,vs2017 准备使用 vs2015 编译器和库,但不会回到 2005 年。这是为什么跨 DLL 边界传递 c++ 对象往往不会从长远来看,双方的定义必须保持一致。
-
我不确定你的钩子方法是否支持这个,但如果你只是遇到
wstring的问题,你可以将旧的wstring定义复制到你的项目中并专门使用它在这个钩子里。更好的是比较两个版本并了解它们的差异;然后创建一个知道如何完整读取字符串的函数。 -
MSVC 中
std::wstring的最大变化是小字符串优化(添加)和可能(我不再安装 2005)写时复制(删除),因为标准不再允许这样做.所以std::wstring的内部细节发生了相当大的变化。