【问题标题】:Wide strings Visual Studio 2005 vs 2017?宽字符串 Visual Studio 2005 vs 2017?
【发布时间】: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的内部细节发生了相当大的变化。

标签: c++ reverse-engineering


【解决方案1】:

经过一些研究人员和一些朋友的帮助。我已经实现了我想要的,即使用 const wchar_t* 的构造函数构建 vs 2005 的旧 wstring 类并使用它。

class wstring05 {
    public:
        wstring05(const wchar_t* cstr)
        {
            allocator = nullptr;
            reserved_size = size = wcslen(cstr);
            if (size < 8)
                memcpy(buffer, cstr, (size + 1) * sizeof(wchar_t));
            else
                p_buffer = cstr;
        }

    private:

        void *allocator;
        union {
            wchar_t buffer[8];
            const wchar_t* p_buffer;
        };

        int size;
        int reserved_size;
    };

【讨论】:

    猜你喜欢
    • 2017-12-16
    • 2020-01-31
    • 1970-01-01
    • 2018-03-31
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多