C++ Int到LPWSTR函数的问题

C++ Int到LPWSTR函数的问题,c++,winapi,int,wchar-t,data-conversion,C++,Winapi,Int,Wchar T,Data Conversion,我正在制作一个win32程序,它是一个级别编辑工具,与我为2D平铺系统创建的库一起使用 我想创建一个对话框,当用户从菜单中选择时显示地图属性。这意味着从int到wchar\t数组的转换。我已经创建了一个函数,我希望它能做到这一点。但是,当前它只返回返回返回变量初始化为的空白字符串。使用“映射属性”对话框调用的SetDlgItemText()函数时,需要进行此转换 以下是我目前拥有的功能: LPWSTR IntToLPWSTR(int value) { std::ostringstream

我正在制作一个win32程序,它是一个级别编辑工具,与我为2D平铺系统创建的库一起使用

我想创建一个对话框,当用户从菜单中选择时显示地图属性。这意味着从int到wchar\t数组的转换。我已经创建了一个函数,我希望它能做到这一点。但是,当前它只返回返回返回变量初始化为的空白字符串。使用“映射属性”对话框调用的SetDlgItemText()函数时,需要进行此转换

以下是我目前拥有的功能:

LPWSTR IntToLPWSTR(int value)
{
    std::ostringstream  convert;
    std::string         out;

    convert << value;
    out = convert.str();

    const char*             in;
    in = out.c_str();

    LPWSTR ret = L"";
    MultiByteToWideChar(CP_ACP, MB_COMPOSITE, in, strlen(in), ret, wcslen(ret));

    return ret;
}

要编辑的映射只是指向我自己的映射类的指针,该类包含我要显示的属性。下面三个对SetDlgItemText()的调用将L“”作为字符串传递,目的是在函数运行时也使用该函数。

将int转换为
常量wchar\t*
无需花费大量精力。从C++11开始,您可以采取两步方法来实现
std::wstring
const wchar\u t*

SetDlgItemText(hDlg, IDC_TILE_WIDTH_LBL, std::to_wstring(mapToEdit->TileWidth()).c_str());

当然,您可以将其放入一个函数中,使其成为一个步骤,但请记住,在使用指针时,您不能让
std::wstring
被破坏。

您无需花费大量精力将int转换为
常量wchar\t*
。从C++11开始,您可以采取两步方法来实现
std::wstring
const wchar\u t*

SetDlgItemText(hDlg, IDC_TILE_WIDTH_LBL, std::to_wstring(mapToEdit->TileWidth()).c_str());

当然,您可以将其放入函数中,使其成为一个步骤,但请记住,在使用指针时,您不能让
std::wstring
被破坏。

std::towstring
更简单,但要指出代码中的问题,您从未创建过缓冲区<代码>LPWSTR ret=L“”使
ret
成为指向静态内存中保存的数组的指针。无法修改此数组

下面是使用
std::wstring
作为缓冲区修复代码的一种方法:

std::wstring IntToWstring(int value)
{
    std::ostringstream  convert;
    std::string         out;

    convert << value;
    out = convert.str();
    std::wstring ret;
    // Find proper length
    int length = MultiByteToWideChar(CP_ACP, 0, out.c_str(), out.length(), nullptr, 0);
    ret.resize(length);
    // Probably should also check for errors (got rid of MB_COMPOSITE flag)
    MultiByteToWideChar(CP_ACP, 0, out.c_str(), out.length(), &ret[0], length);

    return ret;
}

std::towstring
更简单,但要指出代码中的问题,您从未创建过缓冲区<代码>LPWSTR ret=L“”使
ret
成为指向静态内存中保存的数组的指针。无法修改此数组

下面是使用
std::wstring
作为缓冲区修复代码的一种方法:

std::wstring IntToWstring(int value)
{
    std::ostringstream  convert;
    std::string         out;

    convert << value;
    out = convert.str();
    std::wstring ret;
    // Find proper length
    int length = MultiByteToWideChar(CP_ACP, 0, out.c_str(), out.length(), nullptr, 0);
    ret.resize(length);
    // Probably should also check for errors (got rid of MB_COMPOSITE flag)
    MultiByteToWideChar(CP_ACP, 0, out.c_str(), out.length(), &ret[0], length);

    return ret;
}

谢谢,我想可能有一个函数,但在搜索msdn时在中看不到它。谢谢,我想可能有一个函数,但在搜索msdn时在中看不到它。啊,我看到了,但从来没有对它发表过评论。如果
std::to_wstring
有效,这里显然会使用C++11,但我要指出的是,使用
std::wstring
作为缓冲区仅在C++11中是可靠的。@chris:另外,我不知道为什么我以前没有想到它,但是OP也可以使用
std::wostringstream
。我想没有人真的被教导说,
std::cout
和其他东西不是唯一的,或者你实际上可以使用任何你想要的字符类型。我知道我不是。谢谢所有的信息,以前从来没有真正的用宽字符串,它可能显示:有用的是,知道STD::ToWWStin只使用C++ 11编译器可靠。我会记住这一点,并使用std::wostringstream创建函数。啊,我看到了这一点,但实际上从未对此发表过评论。如果
std::to_wstring
有效,这里显然会使用C++11,但我要指出的是,使用
std::wstring
作为缓冲区仅在C++11中是可靠的。@chris:另外,我不知道为什么我以前没有想到它,但是OP也可以使用
std::wostringstream
。我想没有人真的被教导说,
std::cout
和其他东西不是唯一的,或者你实际上可以使用任何你想要的字符类型。我知道我不是。谢谢所有的信息,以前从来没有真正的用宽字符串,它可能显示:有用的是,知道STD::ToWWStin只使用C++ 11编译器可靠。我将记住这一点,并使用std::wostringstream创建函数。