这是“LPCTSTR typecast for use with GetFileAttributes”
的后续内容我通过GetLastError();
扩展了我的方法。
我将DWORD转换为unsigned int并尝试使用MessageBox显示它。
代码确实有效,但我无法使用MessageBox从DWORD dw
方法可视化Unsigned 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
}
答案 0 :(得分:3)
你遇到的根本问题是你的演员阵容不正确。当编译器告诉您传递的参数类型错误时,正确的方法是找到一种方法来传递具有正确类型的东西。相反,你把值简单地说给编译器,#34;我比你知道的更好,请忽略变量的类型并假装它就是我所说的。"
所以,而不是写
(LPCWSTR)test
您需要将整数test
转换为以null结尾的宽字符串。有很多方法可以做到这一点。例如,您可以使用字符串流:
std::wstringstream sstream;
sstream << test;
std::wstring str = test.str();
然后,您可以将str.c_str()
传递给MessageBox
API。
在C ++ 11中,您可以像这样使用std::to_wstring()
:
std::wstring str = std::to_wstring();
您正在正确解释GetFileAttributes
返回的值。这些是位标志的组合。换句话说,可以设置多个文件属性标志。您需要使用按位和运算符&
来测试是否存在标志。
你也得到错误检查严重错误。文档说:
如果函数失败,则返回值为INVALID_FILE_ATTRIBUTES。要获取扩展错误信息,请调用GetLastError。
换句话说,当GetLastError
返回值GetFileAttributes
时,您应该只调用INVALID_FILE_ATTRIBUTES
。这是一个非常常见的错误,即认为错误由GetLastError
指示返回非零值。您必须阅读每个API函数的文档,以明确它是如何表示错误的。
最后,如果您成功获取了有效的Win32错误代码,请使用FormatMessage
获取错误的文字说明。
答案 1 :(得分:1)
您无法在字符串中输入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;
}