-2

这是“ LPCTSTR typecast for use with GetFileAttributes ”的后续内容

我扩展了我的方法 GetLastError();

我将 DWORD 转换为无符号整数并尝试使用 MessageBox 显示它。

该代码确实有效,但我无法使用 MessageBox 可视化该方法的值DWORD dwUnsigned int test来自该GetLastError();方法的值并弄清楚如何继续。

这是一个win32项目,我试图构建一种方法来查看硬盘上是否存在文件。

有超过 15.000 个错误代码,不可能全部硬编码。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx

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

    unsigned int test;
    DWORD dw = GetLastError();
    test =(unsigned int)dw;
    if(test == 0){
        MessageBox(NULL,(LPCWSTR)test, L"Target == 0",MB_OK);
    }
    else
    {
        MessageBox(NULL,(LPCWSTR)test, L"Target != 0",MB_OK);
    }

    switch(dw)
    {
    case ERROR_SUCCESS:
        MessageBox(NULL,L"ERROR_SUCCESS", L"File Error",MB_OK);
        break;
    case ERROR_PATH_NOT_FOUND:
        MessageBox(NULL,L"ERROR_PATH_NOT_FOUND", L"File Error",MB_OK);
        break;
    default:
        MessageBox(NULL,(LPCWSTR)dw, L"File Error",MB_OK);
        break;
    }

    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;
        //case INVALID_FILE_ATTRIBUTES:
        //  MessageBox(NULL,L"INVALID_FILE_ATTRIBUTES",L"File Error",MB_OK);
        //  break;
        //case FILE_INVALID_FILE_ID:
        //  MessageBox(NULL,L"Failed to get image file,\\please check game folder",L"File Error",MB_OK);
        //  break;
        default:
            MessageBox(NULL,(LPCWSTR)dwAttrib,L"File Error",MB_OK);
            break;
    }

  return true; // testing phase
}
4

2 回答 2

3

您遇到的根本问题是您的演员表不正确。当编译器告诉您传递的参数类型错误时,正确的方法是找到一种方法来传递具有正确类型的内容。相反,您转换的值只是对编译器说,“我比你更清楚,请忽略变量的类型并假装它就是我所说的那样。”

所以,而不是写

(LPCWSTR)test

您需要将整数转换为test以空字符结尾的宽字符串。有很多方法可以做到这一点。例如,您可以使用字符串流:

std::wstringstream sstream;
sstream << test;
std::wstring str = test.str();

然后你可以传递str.c_str()MessageBoxAPI。

在 C++11 中,你可以这样使用std::to_wstring()

std::wstring str = std::to_wstring();

您正在解释GetFileAttributes错误返回的值。这些是位标志的组合。换言之,可以设置多个文件属性标志。您需要使用按位和运算符&来测试标志的存在。


您还会得到错误检查严重错误。文档说:

如果函数失败,则返回值为 INVALID_FILE_ATTRIBUTES。要获取扩展错误信息,请调用 GetLastError。

换句话说,您应该只GetLastErrorGetFileAttributes返回值时调用INVALID_FILE_ATTRIBUTES. 这是一个非常常见的错误,认为错误是通过GetLastError返回非零值来指示的。您必须阅读每个 API 函数的文档,以清楚了解它如何发出错误信号。


最后,如果您确实成功获取了有效的 Win32 错误代码,请使用FormatMessage获取错误的文本描述。

于 2014-05-29T17:53:17.417 回答
1

您不能将 a 类型DWORD转换为字符串。你必须格式化它。

您的错误检查是错误的。

成功时,GetFileAttributes()可以(并且经常)一次返回多个属性,但您没有处理这种可能性。您正在检查的某些值甚至不是值属性。

试试这个:

BOOL FileExists(LPCTSTR szPath)
{
    DWORD dwAttrib = GetFileAttributes(szPath);
    if (dwAttrib == INVALID_FILE_ATTRIBUTES)
    {
        DWORD dw = GetLastError();
        switch (dw)
        {
            case ERROR_PATH_NOT_FOUND:
                MessageBoxW(NULL, L"ERROR_PATH_NOT_FOUND", L"File Error", MB_OK);
                break;

            case ERROR_FILE_NOT_FOUND:
                MessageBoxW(NULL, L"ERROR_FILE_NOT_FOUND", L"File Error", MB_OK);
                break;

            default:
            {
                std::wstringstream msg;
                msg << L"Error Code: " << dw;

                LPWSTR lpMsg = NULL;
                if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dw, 0, (LPWSTR)&lpMsg, 0, NULL))
                {
                    msg << std::endl << lpMsg;
                    LocalFree(lpMsg);
                }

                MessageBoxW(NULL, msg.str().c_str(), L"File Error", MB_OK);
                break;
            }
        }

        return false;
    }
    else
    {
        std::wstringstream attribs;

        if (dwAttrib & FILE_ATTRIBUTE_READONLY)
        {
            attribs << L"FILE_ATTRIBUTE_READONLY" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_READONLY;
        }

        if (dwAttrib & FILE_ATTRIBUTE_HIDDEN)
        {
            attribs << L"FILE_ATTRIBUTE_HIDDEN" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_HIDDEN;
        }

        if (dwAttrib & FILE_ATTRIBUTE_SYSTEM)
        {
            attribs << L"FILE_ATTRIBUTE_SYSTEM" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_SYSTEM;
        }

        if (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)
        {
            attribs << L"FILE_ATTRIBUTE_DIRECTORY" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_DIRECTORY;
        }

        if (dwAttrib & FILE_ATTRIBUTE_ARCHIVE)
        {
            attribs << L"FILE_ATTRIBUTE_ARCHIVE" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_ARCHIVE;
        }

        if (dwAttrib & FILE_ATTRIBUTE_DEVICE)
        {
            attribs << L"FILE_ATTRIBUTE_DEVICE" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_DEVICE;
        }

        if (dwAttrib & FILE_ATTRIBUTE_NORMAL)
        {
            attribs << L"FILE_ATTRIBUTE_NORMAL" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_NORMAL;
        }

        if (dwAttrib & FILE_ATTRIBUTE_TEMPORARY)
        {
            attribs << L"FILE_ATTRIBUTE_TEMPORARY" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_TEMPORARY;
        }

        if (dwAttrib & FILE_ATTRIBUTE_SPARSE_FILE)
        {
            attribs << L"FILE_ATTRIBUTE_SPARSE_FILE" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_SPARSE_FILE;
        }

        if (dwAttrib & FILE_ATTRIBUTE_REPARSE_POINT)
        {
            attribs << L"FILE_ATTRIBUTE_REPARSE_POINT" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_REPARSE_POINT;
        }

        if (dwAttrib & FILE_ATTRIBUTE_COMPRESSED)
        {
            attribs << L"FILE_ATTRIBUTE_COMPRESSED" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_COMPRESSED;
        }

        if (dwAttrib & FILE_ATTRIBUTE_OFFLINE)
        {
            attribs << L"FILE_ATTRIBUTE_OFFLINE" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_OFFLINE;
        }

        if (dwAttrib & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)
        {
            attribs << L"FILE_ATTRIBUTE_NOT_CONTENT_INDEXED" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_NOT_CONTENT_INDEXED;
        }

        if (dwAttrib & FILE_ATTRIBUTE_ENCRYPTED)
        {
            attribs << L"FILE_ATTRIBUTE_ENCRYPTED" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_ENCRYPTED;
        }

        if (dwAttrib & FILE_ATTRIBUTE_VIRTUAL)
        {
            attribs << L"FILE_ATTRIBUTE_VIRTUAL" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_VIRTUAL;
        }

        if (dwAttrib != 0)
            attribs << L"Other: " << std::hex << std::showbase << std::setw(8) << std::setfill(L'0') << dwAttribs << std::endl;

        MessageBoxW(NULL, attribs.str().c_str(), L"File Attributes", MB_OK);

        return true;
    }
于 2014-05-29T17:54:13.960 回答