将const char *转换为const wchart_t的C ++编程*

时间:2016-08-19 20:47:49

标签: c++

我有一些问题要让这段代码工作:

#include <iostream>
#include <Windows.h>
#include <string>

using namespace std;

string Filepath;

string Temp;

int WINAPI WinMain(HINSTANCE instanceHandle, HINSTANCE, char*, int)
{
    const char* env_p = std::getenv("TEMP");
    std::getenv("TEMP");
    Temp = env_p;
    Filepath = Temp + "\\File.txt";


Editfile id(Filepath.c_str());
    std::cin.get();
    return 0;
}

错误C2664无法从“const char *”转换为“const wchar_t *”

我看到了问题,但我不容易解决它。

1 个答案:

答案 0 :(得分:0)

char这样的基于std::getenv的函数可以在Windows中返回不可用的数据,因为Windows中的标准窄编码非常有限。

而是使用宽字符函数,以及环境内容,最好是Windows API本身。

然后没有必要在编码之间进行转换,因为它是所有UTF-16,在C ++中表示为基于wchar_t的字符串:

#include <string>
#include <stdexcept>        // runtime error
using namespace std;

#undef UNICODE
#define UNICODE
#undef NOMINMAX
#define NOMINMAX
#undef STRICT
#define STRICT
#include <windows.h>

auto hopefully( bool const e ) -> bool { return e; }
[[noreturn]] auto fail( string const& s ) -> bool { throw runtime_error( s ); }

auto path_to_tempdir()
    -> wstring
{
    wstring result( MAX_PATH, L'#' );

    DWORD const n = GetTempPath( result.size(), &result[0] );
    hopefully( 0 < n && n < result.size() )
        || fail( "GetTempPath failed" );
    result.resize( n );
    return result;
}

auto main() 
    -> int
{
    // Just crash if there's no temp directory.
    DWORD const as_infobox    = MB_ICONINFORMATION | MB_SETFOREGROUND;
    MessageBox( 0, path_to_tempdir().c_str(), L"Temp directory:", as_infobox );
}