LPCTSTR类型转换与GetFileAttributes一起使用

时间:2014-05-29 01:43:46

标签: c++ winapi casting

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

    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"是否包含正确的信息?

2 个答案:

答案 0 :(得分:4)

std::string基于char,因此当您致电.c_str()时,您可以char *

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

我相信,如果您在启用UNICODE的情况下进行编译(因此LPCTSTR == LPCWSTR),则需要使用std::wstring

相关:

答案 1 :(得分:1)

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

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