C++ 用于GetFileAttributes的LPCTSTR类型转换

C++ 用于GetFileAttributes的LPCTSTR类型转换,c++,winapi,casting,C++,Winapi,Casting,我正在尝试构建一个方法来查看文件是否存在。 当前的方法形式不完整。 我正试图弄清楚为什么它不能像代码一样工作 BOOL FileExists(LPCTSTR szPath) { //MessageBox(NULL,szPath,L"File Error",MB_OK); DWORD dwAttrib = GetFileAttributes(szPath); switch(dwAttrib)

我正在尝试构建一个方法来查看文件是否存在。 当前的方法形式不完整。 我正试图弄清楚为什么它不能像代码一样工作

    BOOL FileExists(LPCTSTR szPath)
        {
            //MessageBox(NULL,szPath,L"File Error",MB_OK);
          DWORD dwAttrib = GetFileAttributes(szPath);

            switch(dwAttrib)
            {

                case FILE_ATTRIBUTE_DIRECTORY:
                    MessageBox(NULL,L"FILE_ATTRIBUTE_DIRECTORY",L"File Error",MB_OK);
                    break;
                case FILE_ATTRIBUTE_ARCHIVE:
                    MessageBox(NULL,L"FILE_ATTRIBUTE_ARCHIVE",L"File Error",MB_OK);
                    break;
                case FILE_READ_ONLY_VOLUME:
                    MessageBox(NULL,L"FILE_READ_ONLY_VOLUME",L"File Error",MB_OK);
                    break;
                case FILE_INVALID_FILE_ID:
                    MessageBox(NULL,L"FILE_INVALID_FILE_ID",L"File Error",MB_OK);
                    break;
                default:
                    MessageBox(NULL,(LPCWSTR)dwAttrib,L"File Error",MB_OK);
                    break;
            }
return true;
        }
下面是我如何调用该方法的:

FileExists((LPCWSTR)path.c_str());
这是我的文件所在的位置:

std::string path = "C:\\smiley.bmp"
我总是在这里结束,不知道开关是按什么顺序编码的:

FILE_INVALID_FILE_ID
我想知道我是否正确地输入了
“LPCTSTR”

因为我尝试使用MessageBox来显示
“szPath”
的内容,结果显示为人类无法解码的格式

我提供的路径是正确的,正确转义。
如何检查
“szPath”
是否包含正确的信息?

std::string
基于
char
,因此当您调用
.c_str()
时,可以使用
char*

但是
LPCWSTR
是指向宽字符串的指针

我相信,如果您在编译时启用了
UNICODE
(因此
LPCTSTR
=
LPCWSTR
),则需要使用
std::wstring

相关:


  • std::string
    基于
    char
    ,因此当您调用
    .c_str()
    时,可以使用
    char*

    但是
    LPCWSTR
    是指向宽字符串的指针

    我相信,如果您在编译时启用了
    UNICODE
    (因此
    LPCTSTR
    =
    LPCWSTR
    ),则需要使用
    std::wstring

    相关:


      • 强制转换不会将字符串转换为宽字符串。它只是告诉编译器关闭,错误就会移动。您需要文字字符串上的L前缀才能使其成为宽字符串。您需要使用wstring而不是string

        std::wstring path = L"C:\\smiley.bmp";
        FileExists(path.c_str());
        

        强制转换不会将字符串转换为宽字符串。它只是告诉编译器关闭,错误就会移动。您需要文字字符串上的L前缀才能使其成为宽字符串。您需要使用wstring而不是string

        std::wstring path = L"C:\\smiley.bmp";
        FileExists(path.c_str());
        

        MessageBox(NULL,(LPCWSTR)dwAttrib,L“文件错误”,MB_OK)DWORD
        转换为
        LPCWSTR
        并将其打印出来不会帮助您找出任何问题。最佳情况:它将打印垃圾。您必须了解这些强制转换的作用。他们不会做你认为他们会做的事。
        MessageBox(NULL,(LPCWSTR)dwAttrib,L“File Error”,MB_OK)DWORD
        转换为
        LPCWSTR
        并将其打印出来不会帮助您找出任何问题。最佳情况:它将打印垃圾。您必须了解这些强制转换的作用。他们不会做你认为他们会做的事。谢谢你的回答。但是我现在有点迷路了!我需要改变什么?谢谢你的回答。但是我现在有点迷路了!我需要更改什么?好的,我做错了,忘了在path变量中添加“L”。该软件编译得很好,但我仍然遇到了相同的问题“FILE\u INVALID\u FILE\u ID”。我添加了#include,它应该可以工作,因为文件位于该spotOk上,我做得不对,忘记在path变量中添加“L”。该软件编译得很好,但我仍然遇到了相同的问题“FILE\u INVALID\u FILE\u ID”。我补充说#include,它应该可以工作,因为文件就在那里