首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能将LPCWSTR转换为LPCSTR?

不能将LPCWSTR转换为LPCSTR?
EN

Stack Overflow用户
提问于 2022-05-02 20:02:20
回答 1查看 89关注 0票数 0

我不明白这个错误。我一直试图列出目录中的文件,但是我不理解这个错误。

这是我下面的代码;

代码语言:javascript
复制
#include <Windows.h>
#include <iostream>
using namespace std;

    int main() {
        WIN32_FIND_DATA FindFileData;
        HANDLE hFindFile;
        LPCWSTR file = L"*.cpp";
    
        hFindFile = FindFirstFile(file,&FindFileData);
    
        if(INVALID_HANDLE_VALUE == hFindFile)
        {
            cout << "Error in Finding File" << endl;
            cout << "Error - " << GetLastError() << endl;
        }
        else
        {
            cout << "File Found" << endl;
            wcout << "File Name - " << FindFileData.cFileName << endl;
            wcout << "File Size - " << FindFileData.nFileSizeLow << endl;
        }
    
    return 0;
    }
EN

回答 1

Stack Overflow用户

发布于 2022-05-02 20:10:50

您正在使用TCHAR-based Win32 API,它们是预处理器宏,映射到ANSI或UNICODE功能风格、结构类型等。

您显然没有用UNICODE定义编译项目,因此宏正在映射到它们的ANSI版本(即:WIN32_FIND_DATA -> WIN32_FIND_DATAAFindFirstFile() -> FindFirstFileA()等)。有关更多详细信息,请参见MSDN上的使用Strings

您正在尝试将一个Unicode字符串传递给FindFirstFileA(),后者需要一个窄的ANSI字符串,因此出现了错误。同样明显的是,您期待的是API的Unicode版本,因为您试图将FindFileData.cFileName传递给std::wcout而不是std::cout

尝试使用TCHAR字符串,这样代码就可以用于ANSI或UNICODE编译(老实说,自Win9x/ME以来就不再需要这种编译了)。自NT4/XP以来,现代Windows一直是一个完整的Unicode操作系统:

代码语言:javascript
复制
#include <Windows.h>
#include <iostream>

#ifdef UNICODE
#define t_cout std::wcout
else
#define t_cout std::cout
#endif

int main() {
    WIN32_FIND_DATA FindFileData;
    HANDLE hFindFile;
    LPCTSTR file = TEXT("*.cpp");
    
    hFindFile = FindFirstFile(file, &FindFileData);
    
    if (INVALID_HANDLE_VALUE == hFindFile)
    {
        DWORD err = GetLastError();
        std::cout << "Error in Finding File\n";
        std::cout << "Error - " << err << '\n';
    }
    else
    {
        std::cout << "File Found\n";
        t_cout << TEXT("File Name - ") << FindFileData.cFileName << TEXT('\n');

        ULARGE_INTEGER filesize;
        filesize.LowPart = FindFileData.nFileSizeLow;
        filesize.HighPart = FindFileData.nFileSizeHigh;

        std::cout << "File Size - " << filesize.QuadPart << '\n';

        FindClose(hFindFile);
    }
    
    return 0;
}

否则,直接使用ANSI API:

代码语言:javascript
复制
#include <Windows.h>
#include <iostream>

int main() {
    WIN32_FIND_DATAA FindFileData;
    HANDLE hFindFile;
    LPCSTR file = "*.cpp";
    
    hFindFile = FindFirstFileA(file, &FindFileData);
    
    if (INVALID_HANDLE_VALUE == hFindFile)
    {
        DWORD err = GetLastError();
        std::cout << "Error in Finding File\n";
        std::cout << "Error - " << err << '\n';
    }
    else
    {
        std::cout << "File Found\n";
        std::cout << "File Name - " << FindFileData.cFileName << '\n';

        ULARGE_INTEGER filesize;
        filesize.LowPart = FindFileData.nFileSizeLow;
        filesize.HighPart = FindFileData.nFileSizeHigh;

        std::cout << "File Size - " << filesize.QuadPart << '\n';

        FindClose(hFindFile);
    }
    
    return 0;
}

或者,直接使用Unicode API:

代码语言:javascript
复制
#include <Windows.h>
#include <iostream>

int main() {
    WIN32_FIND_DATAW FindFileData;
    HANDLE hFindFile;
    LPCWSTR file = L"*.cpp";
    
    hFindFile = FindFirstFileW(file, &FindFileData);
    
    if (INVALID_HANDLE_VALUE == hFindFile)
    {
        DWORD err = GetLastError();
        std::cout << "Error in Finding File\n";
        std::cout << "Error - " << err << '\n';
    }
    else
    {
        std::cout << "File Found\n";
        std::wcout << L"File Name - " << FindFileData.cFileName << L'\n';

        ULARGE_INTEGER filesize;
        filesize.LowPart = FindFileData.nFileSizeLow;
        filesize.HighPart = FindFileData.nFileSizeHigh;

        std::cout << "File Size - " << filesize.QuadPart << '\n';

        FindClose(hFindFile);
    }
    
    return 0;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72091800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档