【问题标题】:Cannot convert CHAR to LPWSTR无法将 CHAR 转换为 LPWSTR
【发布时间】:2015-06-17 02:29:13
【问题描述】:

我在 Visual Studio 2015 中遇到编译错误,我正在尝试将 char 数据转换为 LPWSTR。我可以吗?还是只适用于字符串类型?

这是我的一段代码:

    ⋮
FILE *sortie;
char fichier[256];//   <--- HERE s my char table

int main(int argc, char *argv[])
{
    //on masque 
    HWND hwnd = GetForegroundWindow();
    ShowWindow(hwnd, SW_HIDE);

    int i, lettre, result, lastresult, lastletter, compteur;

    GetCurrentDirectory(256, fichier); 
    strcat(fichier, "\\fichierlog.txt");

在发布我的问题之前,我在:

  1. https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k%28C2664%29&rd=true

  2. C++ cannot convert from enum to LPCTSTR

  3. How to Convert char* to LPWSTR in VC++?

我没有找到我的案子:(

【问题讨论】:

    标签: c++ lpwstr


    【解决方案1】:

    代替您当前的代码:

    FILE *sortie;
    char fichier[256];//   <--- HERE s my char table
    
    int main(int argc, char *argv[])
    {
        //on masque 
        HWND hwnd = GetForegroundWindow();
        ShowWindow(hwnd, SW_HIDE);
    
        int i, lettre, result, lastresult, lastletter, compteur;
    
        GetCurrentDirectory(256, fichier); 
        strcat(fichier, "\\fichierlog.txt");
    

    例如做

    auto main() -> int
    {
        //on masque 
        HWND hwnd = GetForegroundWindow();
        ShowWindow(hwnd, SW_HIDE);
    
        int i, lettre, result, lastresult, lastletter, compteur;
    
        std::wstring fichier( MAX_PATH, L'\0' );//   <--- HERE s my char table
        const DWORD len = GetCurrentDirectory( fichier.size(), &fichier[0] );
        if( len == 0 || len >= fichier.size() ) { throw std::runtime_error( "GetCurrentDirectory failed." ); }
        fichier.resize( len );
        fichier += L"/fichierlog.txt";
    
        std::ifstream sortie( fichier );
    

    这应该可以解决三个问题:

    • 您正在编译为 Unicode(可能是 Visual Studio 项目),但代码适用于 Windows ANSI API。

    • 您使用的是 C++ 编译器,但代码是低级 C。

    • 缓冲区对于最大路径长度而言太小,并且可能会超出连接的缓冲区。

    请注意,接受宽字符串的 ifstream 构造函数是 Microsoft 扩展。然而,在 C++17 标准库的文件系统中,Windows C++ 编译器实际上需要它。

    【讨论】:

    • 你的回答比我的好。我想知道像fichier(256, 0); 那样将字符串初始化为零就足够了,还是必须是L'\0'
    • 它澄清了我的问题!
    • @BarmakShemirani: 0L'\0' 在这里具有相同的效果,只是一个零值隐式转换为 wchar_t。字符文字只是为了清楚起见。但我经常使用例如L'#' 以便更轻松地检测逐一错误,这可能会在结果中留下一个或多个 # 字符。我还没有发现一个,这个计划运行了 20 年左右。但我不会放弃! :)
    • 谢谢。 std::wstring 有大约 20 个不同的构造函数,我不确定我是否有合适的。
    【解决方案2】:

    您正在使用 unicode 进行编译,因此您必须使用 wchar_t 来声明字符串。不要使用strcat,而是使用wcscat 的unicode 版本。

    还将字符串“\fichierlog.txt”改为L“\fichierlog.txt”

    FILE *sortie;
    //char fichier[256];//   <--- HERE s my char table
    wchar_t fichier[256];//   <--- HERE s my char table
    
    //on masque 
    HWND hwnd = GetForegroundWindow();
    ShowWindow(hwnd, SW_HIDE);
    
    int i, lettre, result, lastresult, lastletter, compteur;
    
    GetCurrentDirectory(256, fichier);
    //strcat(fichier, "\\fichierlog.txt");
    wcscat(fichier, L"\\fichierlog.txt");
    

    【讨论】:

      【解决方案3】:

      您的 Visual Studio 项目设置为使用“widechars”作为默认编码(也称为 UNICODE)进行编译,因此所有 Windows API 在处理字符串时都采用 wchar_t 数组而不是 char 数组。

      要么将您的项目设置为使用标准字符集,要么改用GetCurrentDirectoryA 指定GetCurrentDirectory 的ASCII 版本。

      GetCurrentDirectory 实际上不是一个函数,而是一个预处理器宏,它将根据您的编译器设置使用的编码将您路由到GetCurrentDirectoryAGetCurrentDirectoryW

      【讨论】:

      • 这是我的问题,我现在。
      猜你喜欢
      • 2016-07-20
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      相关资源
      最近更新 更多